当前位置: 首页 > 面试题库 >

Java:无安全管理器:RMI类加载器已禁用

欧阳博超
2023-03-14
问题内容

嗨,我有RMI应用程序,现在我尝试从客户端在服务器上调用一些方法。我有以下代码:

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();
    }
}

服务器已正确加载,但是在尝试致电时server.registerOHLCProvider(provider);出现以下错误:

     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

我已将策略文件添加为VM参数,如下所示:

grant {
    permission java.security.AllPermission;
}

它一直在说关于禁用类加载的东西,所以我想问题就在那儿……谢谢!


问题答案:

远程类加载可能很棘手。

原始帖子不包含有关代码库的任何信息。客户端的安全配置可能正确,但是无法访问远程代码。客户端直接从“代码库”中加载类。服务不会通过RMI连接将它们提供给客户端。该服务仅引用类的外部源。

服务器应指定系统属性java.rmi.server.codebase。该值必须是 客户端可访问 的URL
可以从中加载必需的类。如果这是file:URL, 则客户端必须可以访问 文件系统

反之亦然:如果服务器应该能够从客户端加载类(如此处所示),则客户端必须将代码库属性设置为服务器可访问的URL。



 类似资料:
  • 我遇到了这个问题,尝试了很长时间,仍然无法解决它。stackoverfflow中类似主题中的所有解决方案都已尝试过,但对我来说没有用处。任何帮助都将不胜感激!! 错误: 我有两个server.policy文件在RMI服务器项目,client.policy在RMI客户端项目: 我为服务器项目指定了VM参数: 对于客户项目: 以及服务器的启动程序代码: 我知道这里有使用VM参数的重复策略设置,但即使我

  • 我已经在使用Java 8,它是Nashorn javascript引擎。在我的应用程序中,我出于各种目的从Java classess访问javaScript脚本文件。然而,也可以从javaScript代码访问Java类。但由于我的应用程序中的Javascript也可以由第三方编写,所以我想限制它们(JS脚本)访问Java模块。(特别禁止某些Java类) 我不想限制对Java类的所有访问,只是想寻找

  • 即使我在Mule EE上运行,Mule Security Manager依赖性也没有得到解决。代码如下: http://www.mulesoft.org/schema/mule/spring-security http://www.mulesoft.org/schema/mule/spring-security/current/mule-spring-security.xsd http://www

  • 我对Android开发非常陌生,以前从未使用过Android Studio。我把它设置好,让我的应用程序在我的手机上运行,然后让它单独运行了几个星期。回来后,我在电脑上找不到Android Studio可执行文件,所以我重新安装了它,并重新启动了同一个项目。 不确定这是否与AVD管理器按钮变灰有关。我尝试过的事情: 确保SDK路径正确 以管理员身份运行Android Studio 从Windows

  • 问题内容: 关于Java安全性的这篇文章说: 每当要进行危险的操作时,Java库中的代码都会向安全管理器咨询。 那么,这到底是什么意思?说,如果我已经实现了自己的安全管理器并为整个JVM启用了它。现在,java运行时是否针对每个Java调用(例如System.out.println()等)咨询我的securitymanager,还是仅针对诸如System.exit(),文件操作等api调用进行咨询

  • 因此,我有一个类加载器加载一个类,如下所示: 类在运行时位于另一个jar中。以及是在主jar中生成的,然后我取消了它的归档,所以依赖项就在那里。 如何从外部访问其他依赖项。我加载的类文件? 例外情况: