Java RMI AccessControlException:访问被拒绝

嘿我得到一个AccessControlException: access denied尝试启动我正在编写的RMI应用程序时AccessControlException: access denied ,如果我在默认端口1099或其他动态端口上打开它,我无法理解为什么会出现此exception我的政策文件目前授予所有内容(将在应用完成后更改)。

我被困在哪里出错了,任何帮助都会很有用

我的代码

 public class Main { /** * @param args the command line arguments */ public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException { if (System.getSecurityManager() == null) { System.setSecurityManager ( new RMISecurityManager() ); } CreditCardServer ccs = new CreditCardServer(); int port = 1099; try { port = Integer.valueOf(args[0]); } catch (Exception e) { System.out.println("Invlaid Port"); } if (((port = 49152)) || port ==1099) { System.out.println("Valid Port"); } else { port = 1099; System.out.println("Port not in Dynamic Range 4915265535"); } System.out.println(port); LocateRegistry.createRegistry(port); LocateRegistry.getRegistry().bind("CreditCardServer", ccs); while (true) { //hum? } } 

}

堆栈跟踪

 vega3 [ia32.linux] 23% java -Djava.security.policy=wideopen.policy -jar "BookStore-CreditCardServer.jar 65000" 

有效端口

65000

 Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342) at java.security.AccessController.checkPermission(AccessController.java:553) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.SecurityManager.checkConnect(SecurityManager.java:1051) at java.net.Socket.connect(Socket.java:536) at java.net.Socket.connect(Socket.java:492) at java.net.Socket.(Socket.java:389) at java.net.Socket.(Socket.java:203) at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146) at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340) at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source) at bookstorecreditcardserver.Main.main(Main.java:56) 

我的政策档案

 grant { // Allow everything for now permission java.security.AllPermission; }; 

我一直坚持这一天(在弄清楚我必须从命令行启动rmiregistry之后),尝试使用Eclipse本地工作,最后解决它。 一些指示拯救他人这种残酷的命运:

1 – 使用命令行标志正确分配策略文件:

 java -Djava.security.policy=/home/.../.policy ... 

或者将它直接放在你的代码中:

 System.setProperty("java.security.policy","file:///home/.../.policy"); 

您也可以将它放在与项目根目录相同的文件夹中),以将URI减少到

 file:./.policy 

(使用相对而不是绝对URI – 我实际上直到今天才明白这一点)。

2 – 确保策略文件的格式正确,例如:

 grant codeBase "file:/bin/-" { permission java.security.AllPermission; }; 

这应该是指二进制文件所在的文件夹! 此处详细说明了策略文件的格式。

这就是它,我也推荐这个教程 ,我发现走上正确的轨道非常有帮助。

基本上,我是愚蠢的,我认为因为Java没有抱怨它找到.policy文件AOK,结果是它没有将.policy文件的新副本移动到工作目录中解决了所有问题:-D

我发现这个主题的大多数答案含糊不清,并花了几个小时来调试它。 您的错误很可能是因为策略文件格式不正确或者您未将其正确设置为命令行参数。

如果您收到java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")

  1. 创建一个包含所有权限的安全策略文件,只是为了测试它

grant codeBase "file:/-" { permission java.security.AllPermission; };

  1. 将此安全文件用于客户端和服务器,只是为了让它运行。

  2. 确保你没有任何拼写错误。 我花了几个小时试图弄清楚它为什么不起作用,我输入了-Djava.rmi.security.policy而不是-Djava.security.policy =

对于我们这些只想从Oracle启动并运行RMI教程的人来说,这个安全策略对于该示例来说已经足够了。