para instalar descargar como java networking remoting rmi securitymanager

instalar - Java: sin administrador de seguridad: cargador de clase RMI deshabilitado



java para windows xp (4)

Cada vez que invoca un método en un proxy dinámico RMI, MarshalInputStream (que extiende ObjectInputStream para reemplazar resolveClass y resolveProxyClass ) delega en LoaderHandler para buscar en 3 lugares para que el ClassLoader use:

  1. El ClassLoader del proxy que se invoca (técnicamente, utiliza un truco llamado latestUserDefinedLoader() : sube la pila, buscando el primer método en la pila que no es parte de JRE).
  2. Thread-local contextClassLoader de la persona que llama
  3. Codebase ClassLoader si SecurityManager está habilitado
    1. Si la propiedad del sistema java.rmi.server.useCodebaseOnly=false , el código de clase ClassLoader usa las URL en la base de datos java.rmi.server.codebase . Tenga en cuenta que el valor predeterminado de useCodebaseOnly cambió en JDK 7u21, por lo que la base de código remota ya no se usa a menos que la cambie .
    2. De lo contrario, el código de clase ClassLoader usa las URL en la base local java.rmi.server.codebase .

Por lo tanto, existen algunas posibles razones por las que obtendría una excepción ClassNotFoundException al invocar un método remoto:

  • Si la pila contiene "sin administrador de seguridad: cargador de clase RMI deshabilitado", entonces asegúrese de configurar un SecurityManager como se describe por otros si necesita carga de clase remota para que ambas partes obtengan todas las interfaces remotas y las clases serializables.
  • Si está utilizando la carga de clase remota y dejó de funcionar cuando actualizó a JRE 7u21, entonces configure -Djava.rmi.server.useCodebaseOnly=true para que coincida con el comportamiento anterior, o establezca -Djava.rmi.server.codebase en un espacio- lista separada de URL tanto en el lado local como en el remoto. Y asegúrese de que la computadora pueda acceder a esas URL.
  • Si está utilizando localmente un ClassLoader personalizado cuyo classloader padre define algunas interfaces remotas, asegúrese de llamar a Thread.setContextClassLoader(ClassLoader) para que RMI use ese ClassLoader. (Este era mi problema: tenía un SwingWorker que se programó en un hilo de trabajo que se creó antes de que contextClassLoader se configurara en EventDispatchThread). Por ejemplo, A y C pertenecen a su ClassLoader personalizado pero B pertenece al ClassLoader padre, luego cuando llama a.getB (). GetC (), la llamada getB () usará el cargador de clases personalizado, pero la llamada getC () no podrá encontrar C en el latestUserDefinedClassLoader y tendrá que recurrir al contextClassLoader.

Todo esto es una historia de advertencia sobre el diseño API pobre de ObjectInputStream. ObjectInputStream debería haber requerido que pasaras un parámetro de ClassLoader, no intentes encontrar uno al azar usando latestUserDefinedLoader, contextClassLoader y codebase.

Hola, tengo la aplicación RMI y ahora trato de invocar algunos métodos en el servidor de mi cliente. Tengo el siguiente código:

public static void main(final String[] args) { try { //Setting the security manager System.setSecurityManager(new RMISecurityManager()); IndicatorsService server = (IndicatorsService) Naming .lookup("rmi://localhost/" + IndicatorsService.SERVICE_NAME); DataProvider provider = new OHLCProvider(server); server.registerOHLCProvider(provider); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } catch (NotBoundException e) { e.printStackTrace(); } }

el servidor está cargado correctamente, pero cuando intento llamar a server.registerOHLCProvider(provider); Obtengo estos errores:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: sk.xorty.client.providers.OHLCProvider (no security manager: RMI class loader disabled) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:336) at sun.rmi.transport.Transport$1.run(Transport.java:159) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:155) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255) at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142) at sk.fri.statistics.service.impl.IndicatorsServiceImpl_Stub.registerOHLCProvider(Unknown Source) at sk.fri.statistics.service.Client.main(Client.java:61) Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: sk.xorty.client.providers.OHLCProvider (no security manager: RMI class loader disabled) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:296) at sun.rmi.transport.Transport$1.run(Transport.java:159) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:155) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) Caused by: java.lang.ClassNotFoundException: sk.xorty.client.providers.OHLCProvider (no security manager: RMI class loader disabled) at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:375) at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165) at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620) at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247) at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1574) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:306) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:290) ... 9 more

He agregado mi archivo de política como argumento VM, así es como se ve:

grant { permission java.security.AllPermission; }

Sigue diciendo algo acerca de la carga de clases deshabilitada, así que supongo que el problema está en algún lugar allí ... ¡Gracias!


La carga remota de clases puede ser complicada.

La publicación original no incluye ninguna información sobre la base de código. Puede ser que la configuración de seguridad del cliente sea correcta, pero no tiene acceso al código remoto. Las clases se cargan directamente desde la "base de código" por el cliente. No son presentados al cliente por el servicio a través de la conexión RMI. El servicio simplemente hace referencia a una fuente externa para las clases.

El servidor debe especificar la propiedad del sistema java.rmi.server.codebase . El valor debe ser una URL a la que pueda acceder el cliente, desde donde se pueden cargar las clases necesarias. Si se trata de un file: URL, el sistema de archivos debe ser accesible para el cliente.

Y al revés: si el servidor debe poder cargar clases desde el cliente (como aquí), el cliente debe establecer la propiedad base del código en una URL a la que pueda acceder el servidor.


Necesita el administrador de seguridad del lado del servidor, no solo del lado del cliente.

Sin esto, el motor RMI del servidor se niega a cargar clases desde el cliente, ya que no puede garantizar que no hagan cosas malas en el servidor.

¿Necesita cargar la clase RMI? ¿No podría el servidor ya tener las clases que el cliente intenta enviar?


Sé por qué sucede. por ejemplo, inicia el servidor en el proyecto A, pero usa el Cliente en el proyecto B para solicitar este servidor, esto es incorrecto. Entonces debería poner el servidor y el cliente en el mismo proyecto.