RMI 如何添加库(并授予它们套接字权限)

Posted

技术标签:

【中文标题】RMI 如何添加库(并授予它们套接字权限)【英文标题】:RMI How to add libs (and grant them socket permissions) 【发布时间】:2011-05-29 20:02:08 【问题描述】:

对于一个学校项目,我必须从一个独立的应用程序创建一个分布式系统。我们使用 RMI 进行通信,但遇到了一些问题。

我创建的服务器启动得很好,但是客户端(它使用了一些 Swing 库等)给了我一个 classNotFound 异常。为了解决这个问题,我将我的项目使用的库添加到“C:\Program Files\Java\jre6\lib\ext”。我更喜欢在客户端放置库(就像我对构建所做的那样)。

谁能告诉我这是否可行,如果可行,如何?

问题不止于此,如果我现在启动客户端,我会收到 java.security.AccessControlException。我使用一个策略文件,它看起来像这样:

grant
  permission java.net.SocketPermission 
    "*:1024-65535", "connect,accept";
;

我也尝试添加所有库,但这也无济于事:

grant codebase "file:$java.home/../lib/ext/appframework-1.0.3.jar" 
   permission java.security.AllPermission;
;
grant codebase "file:$java.home/../lib/ext/beansbinding-1.2.1.jar" 
   permission java.security.AllPermission;
;
grant codebase "file:$java.home/../lib/ext/jcalendar-1.3.3.jar" 
   permission java.security.AllPermission;
;
grant codebase "file:$java.home/../lib/ext/looks-2.0.1.jar" 
   permission java.security.AllPermission;
;
grant codebase "file:$java.home/../lib/ext/swing-worker-1.1.jar" 
   permission java.security.AllPermission;
;
grant codebase "file:$java.home/../lib/ext/swingx-1.6.1.jar" 
   permission java.security.AllPermission;
;
grant codebase "file:$java.home/../lib/ext/swingx-bean.jar" 
   permission java.security.AllPermission;
;
grant codebase "file:$java.home/../lib/ext/swingx-ws-2011_01_16.jar" 
   permission java.security.AllPermission;
;

grant
  permission java.net.SocketPermission 
    "*:1024-65535", "connect,accept";
;

我希望任何人都可以帮助我。

-罗伯

【问题讨论】:

【参考方案1】:

调试 java 2 安全异常是一个繁琐的试错过程。我猜您正在使用 JVM 开关启动客户端以添加告诉它使用安全管理器 - 添加以下内容

-Djava.security.debug=access,failure

您将获得大量调试信息,但搜索“拒绝访问”会显示需要针对哪个代码库授予哪些权限。这不是一个科学的过程——你只需要不断尝试,直到你认为你已经解决了所有的安全问题。

【讨论】:

谢谢,当我们超过最后期限时,我会试一试(需要做很多工作,所以最好先让它全部正常运行)【参考方案2】:
grant  
    permission java.security.AllPermission; 
;

【讨论】:

这行得通,但你能告诉我哪些权限可能是问题吗? 对不起,我不知道。最好选择另一个答案。 :)

以上是关于RMI 如何添加库(并授予它们套接字权限)的主要内容,如果未能解决你的问题,请参考以下文章

为正在运行的进程授予功能

如何从服务器调用客户端上的方法?

与 OpenShift 上的 Java 程序的 RMI 或套接字连接

如何处理生成它的对象内部的 SIGPIPE 错误?

Android LocalSocket客户端无法连接到抽象命名空间中的本机服务套接字

Chrome扩展程序Secure Shell套接字访问