Java RMI / 访问被拒绝

Posted

技术标签:

【中文标题】Java RMI / 访问被拒绝【英文标题】:Java RMI / access denied 【发布时间】:2016-04-12 10:05:58 【问题描述】:

我正在尝试创建 RMI 服务器,但在运行时出现以下异常:

java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:4555" "listen,resolve")

我已阅读有关策略文件的 Oracle 教程,这是我插入到 src 文件夹中的 server.policy 文件的内容:

grant codeBase "file:///C:/EclipseProjects/MultiServiceServer/src"

permission java.security.AllPermission;

;

我还将 VM 参数设置为:

-Djava.security.policy=src/server.policy

最后,这是这个简单的 RMI 服务器的代码:

public class Main 

public static void main(String[] args)
       

    System.out.println("Server is running..");

     if (System.getSecurityManager() == null) 
            System.setSecurityManager(new SecurityManager());
     

    try 

        String name = "AvailableService";

        AvailableService service = new ServiceList();

        AvailableService stub = (AvailableService)UnicastRemoteObject.exportObject(service, 0);

        LocateRegistry.createRegistry(4555);

        Registry reg = LocateRegistry.getRegistry(4555);

        reg.bind(name, stub);

        System.out.println(name+" bound");

     catch(Exception e)e.printStackTrace();



感谢您的帮助。

【问题讨论】:

【参考方案1】:

C:/EclipseProjects/MultiServiceServer/src 文件夹在运行时不存在,并且在编译时不包含 .class 文件。因此,授予它任何权限都是徒劳的。除非您使用代码库功能,否则您根本不需要在 RMI 中使用安全管理器。你不是。所以删除安全管理器。

【讨论】:

如果我不使用安全管理器,当我尝试从客户端引用服务器端的对象时,我会得到另一个异常(没有安全管理器:RMI 类加载器已禁用)。我已经读到需要安全管理器才能通过 RMI 加载类。 消息显示ClassNotFoundException,并在括号中提到“(无安全管理器)”作为备注。 问题不是“没有安全管理器”,而是ClassNotFoundException。解决方案不是添加安全管理器,而是将丢失的类添加到引发异常的 JVM 的类路径中。在我陈述的条件下需要安全经理,而不是其他条件。

以上是关于Java RMI / 访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

java.io.FileNotFoundException:(访问被拒绝)

Java - 访问被拒绝 java.io.FileNotFoundException [重复]

LibUsb 声明接口访问被拒绝 Java

java.sql.SQLException:用户'root'@'localhost'的访问被拒绝(使用密码:是)

java.security.AccessControlException:访问被拒绝(java.io.FilePermission

“java.sql.SQLException:用户'root'@'localhost'的访问被拒绝(使用密码:YES)”