You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java RMI HelloWorld项目启动报SocketPermission权限拒绝错误如何解决

RMI HelloWorld 权限错误解决方法

报错根因

你遇到的java.security.AccessControlException报错,核心原因是两个配置错误:

  • 安全策略属性的设置顺序错误,且被注释未生效
  • 安全管理器加载时没有匹配的权限规则允许本地1099端口的连接操作

分步解决方案

方案1(最简测试方案,无需单独启动rmiregistry、无需配置安全策略)

简单本地测试场景下不需要启用安全管理器,直接删除相关配置即可,调整后的HelloServer代码如下:

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject; // 补充缺失的导入包

public class HelloServer {
    public static void main(String[] args) {
        try {
            HelloImp h = new HelloImp("Hello World!"); 
            Hello h_stub = (Hello) UnicastRemoteObject.exportObject(h, 0);
            // 放开注册中心创建代码,无需单独在终端启动rmiregistry
            LocateRegistry.createRegistry(1099);
            Registry registry = LocateRegistry.getRegistry(1099);
            registry.bind("Hello1", h_stub);
            System.out.println("Server ready");
        } catch (Exception e) {
            System.err.println("Error on server : " + e);
            e.printStackTrace();
        }
    }
}

调整后直接启动HelloServer即可运行。

方案2(保留安全管理器的标准配置方案)

如果需要保留安全管理器,按以下步骤调整:

  1. 调整代码配置顺序,安全策略属性必须在安全管理器初始化前设置:
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class HelloServer {
    public static void main(String[] args) {
        try {
            // 先设置安全策略文件路径
            System.setProperty("java.security.policy","file:./default.policy");
            // 再初始化安全管理器
            if (System.getSecurityManager() == null)
                System.setSecurityManager(new SecurityManager());
            HelloImp h = new HelloImp("Hello World!");
            Hello h_stub = (Hello) UnicastRemoteObject.exportObject(h, 0);
            // 若选择单独启动rmiregistry则保留注释,否则放开createRegistry代码
            //LocateRegistry.createRegistry(1099);
            Registry registry = LocateRegistry.getRegistry(1099);
            registry.bind("Hello1", h_stub);
            System.out.println("Server ready");
        } catch (Exception e) {
            System.err.println("Error on server : " + e);
            e.printStackTrace();
        }
    }
}
  1. 在项目根目录创建default.policy文件,写入以下权限配置:
grant {
    permission java.net.SocketPermission "127.0.0.1:1099", "connect,resolve,accept,listen";
    permission java.rmi.RMIPermission "*";
};
  1. 如果你选择单独在终端启动rmiregistry,启动时也需要指定相同的安全策略:
    rmiregistry -J-Djava.security.policy=./default.policy

内容的提问来源于stack exchange,提问作者Marth83

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:57:01