首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java:无安全管理器:禁用RMI类加载器

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

Stack Overflow用户
提问于 2011-06-12 21:07:58
回答 2查看 104.5K关注 0票数 30

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

代码语言:javascript
复制
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);时,收到以下错误:

代码语言:javascript
复制
     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参数,如下所示:

代码语言:javascript
复制
grant {
    permission java.security.AllPermission;
}

它一直在说一些关于禁用类加载的事情,所以我猜问题出在某个地方……谢谢!

EN

回答 2

Stack Overflow用户

发布于 2020-01-17 18:32:16

我想补充一些可能对一些人有帮助的东西,特别是乞讨者。我来到这里寻找上述错误的解决方案,但作为一个初学者,我不知道如何使用安全策略和指定"java.rmi.server.codebase“属性。修复该错误的最简单方法是确保要通过RMI发送的对象的类位于包的相同路径中。通过这种方式,两个应用程序都将类放在相对于其主文件夹的相同位置,错误将得到解决。

示例:如果您希望从服务器向客户端发送类型为MedicationDTO (可序列化)的对象,请确保它位于相同的包路径中。在我的例子中,在服务器应用程序中,对象在com.example.springdemo.dto中,而在客户端应用程序中,它在com.example.springdemo.service.dto中。问题是,在使用IntelliJ时,因为service包中没有任何内容,而是另一个包,所以它们的名称是连接在一起的(service.dto),我看不出路径不同。因此,请确保您的类具有相同的包路径。(我的解决方案是:com.example.springdemo.dto包中的两个应用程序中都必须有MedicationDTO类。

我知道这不是最好的解决方案,这只是一个“小把戏”,但我当时会非常高兴地找到这个解决方案,因为它节省了我解决问题的大量浪费时间。

我希望这将对那些想要快速修复该错误的人有所帮助,因为我认为学习使用安全管理器和包括代码库可能有点棘手,并且需要时间。

票数 7
EN

Stack Overflow用户

发布于 2014-04-21 18:01:01

我知道为什么会这样。例如,您在项目A中启动服务器,但在项目B中使用客户端来请求此服务器,这是错误的。因此,您应该将服务器和客户端放在同一个项目中。

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6322107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档