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(保留安全管理器的标准配置方案)
如果需要保留安全管理器,按以下步骤调整:
- 调整代码配置顺序,安全策略属性必须在安全管理器初始化前设置:
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(); } } }
- 在项目根目录创建
default.policy文件,写入以下权限配置:
grant { permission java.net.SocketPermission "127.0.0.1:1099", "connect,resolve,accept,listen"; permission java.rmi.RMIPermission "*"; };
- 如果你选择单独在终端启动rmiregistry,启动时也需要指定相同的安全策略:
rmiregistry -J-Djava.security.policy=./default.policy
内容的提问来源于stack exchange,提问作者Marth83
相关产品推荐
相关产品推荐

