首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java RMI AccessControlException:访问被拒绝

Java RMI AccessControlException:访问被拒绝
EN

Stack Overflow用户
提问于 2010-03-12 02:08:51
回答 3查看 67K关注 0票数 19

嘿,当我尝试启动我正在编写的RMI应用程序时,我得到了一个AccessControlException: access denied,我不知道为什么我会得到这个异常,如果我在默认端口1099上打开它,或者在另一个动态端口上,我的策略文件当前授予所有东西(将在应用程序完成时更改)。

我被困在哪里出了问题,任何帮助都是非常有用的。

My code

代码语言:javascript
复制
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?
     }
}

}

堆栈跟踪

代码语言:javascript
复制
vega3 [ia32.linux] 23% java -Djava.security.policy=wideopen.policy -jar "BookStore-CreditCardServer.jar 65000"

有效端口

65000

代码语言:javascript
复制
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)

我的策略文件

代码语言:javascript
复制
grant {
// Allow everything for now
permission java.security.AllPermission;
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-12 02:24:19

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

票数 3
EN

Stack Overflow用户

发布于 2012-04-15 06:33:16

我已经被这个问题困扰了一整天(在弄清楚我必须从命令行启动rmiregistry之后),试图用Eclipse在本地工作,最终解决了这个问题。以下是拯救他人这一残酷命运的一些建议:

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

代码语言:javascript
复制
java -Djava.security.policy=/home/.../<filename>.policy ...

或者直接将此代码放入代码中:

代码语言:javascript
复制
System.setProperty("java.security.policy","file:///home/.../<filename>.policy");

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

代码语言:javascript
复制
file:./<filename>.policy

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

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

代码语言:javascript
复制
grant codeBase "file:<path>/bin/-" {
    permission java.security.AllPermission;
};

这应该是指你的二进制文件所在的文件夹!有关策略文件格式的详细说明,请参阅here

这就是它,我也推荐this tutorial,我发现它对进入正确的轨道非常有帮助。

票数 30
EN

Stack Overflow用户

发布于 2018-02-15 23:41:27

我发现这个主题上的大多数答案都是模糊和无用的,并花了几个小时对其进行调试。更有可能的是,您的错误是因为策略文件的格式不正确,或者没有正确地将其设置为命令行参数。

如果你有一台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.security.policy=...

而不是-Djava.rmi.security.policy

对于我们这些只想从Oracle获得RMI教程的人来说,这个安全策略对于这个例子来说已经足够了。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2427473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档