嘿,当我尝试启动我正在编写的RMI应用程序时,我得到了一个AccessControlException: access denied
,我不知道为什么我会得到这个异常,如果我在默认端口1099上打开它,或者在另一个动态端口上,我的策略文件当前授予所有东西(将在应用程序完成时更改)。
我被困在哪里出了问题,任何帮助都是非常有用的。
My code
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 <= 65535) && (port >= 49152)) || port ==1099)
{
System.out.println("Valid Port");
}
else
{
port = 1099;
System.out.println("Port not in Dynamic Range 49152<-->65535");
}
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.<init>(Socket.java:389)
at java.net.Socket.<init>(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;
};
发布于 2010-03-12 02:24:19
基本上,我很愚蠢,我假设因为Java没有抱怨它正在寻找.policy文件AOK,结果它没有将the.policy文件的新副本移动到工作目录中解决了所有问题:-D
发布于 2012-04-15 06:33:16
我已经被这个问题困扰了一整天(在弄清楚我必须从命令行启动rmiregistry之后),试图用Eclipse在本地工作,最终解决了这个问题。以下是拯救他人这一残酷命运的一些建议:
1-正确分配策略文件,使用命令行标记:
java -Djava.security.policy=/home/.../<filename>.policy ...
或者直接将此代码放入代码中:
System.setProperty("java.security.policy","file:///home/.../<filename>.policy");
您还可以将其放在与项目根目录相同的文件夹中,以将URI减少到
file:./<filename>.policy
(使用相对URI而不是绝对URI-我直到今天才明白这一点)。
2-确保策略文件的格式正确,例如:
grant codeBase "file:<path>/bin/-" {
permission java.security.AllPermission;
};
这应该是指你的二进制文件所在的文件夹!有关策略文件格式的详细说明,请参阅here。
这就是它,我也推荐this tutorial,我发现它对进入正确的轨道非常有帮助。
发布于 2018-02-15 23:41:27
我发现这个主题上的大多数答案都是模糊和无用的,并花了几个小时对其进行调试。更有可能的是,您的错误是因为策略文件的格式不正确,或者没有正确地将其设置为命令行参数。
如果你有一台java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")
中对其进行测试
grant codeBase "file:/-" { permission java.security.AllPermission; };
而不是-Djava.rmi.security.policy
对于我们这些只想从Oracle获得RMI教程的人来说,这个安全策略对于这个例子来说已经足够了。
https://stackoverflow.com/questions/2427473
复制相似问题