gpt4 book ai didi

Java RMI 访问控制异常 : access denied

转载 作者:IT老高 更新时间:2023-10-28 20:59:27 35 4
gpt4 key购买 nike

嘿,我在尝试启动我正在编写的 RMI 应用程序时遇到 AccessControlException: access denied,如果我在默认端口 1099,或在另一个动态端口上,我的策略文件当前授予所有内容(应用程序完成后将更改)。

我不知道哪里出了问题,任何帮助都会很有用

我的代码

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;
};

最佳答案

我整天都被困在这个问题上(在弄清楚我必须从命令行启动 rmiregistry 之后),试图用 Eclipse 在本地进行这项工作,并最终解决了它。拯救他人这种残酷命运的几点建议:

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

java -Djava.security.policy=/home/.../<filename>.policy ...

或将其直接放入您的代码中:

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

你也可以把它和你的项目根目录放在同一个文件夹),以减少URI到

file:./<filename>.policy

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

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

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

这应该是指您的二进制文件所在的文件夹!策略文件格式的详细解释是 here .

就是这样,我还推荐this tutorial ,我发现走上正轨很有帮助。

关于Java RMI 访问控制异常 : access denied,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2427473/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com