将Eclipse Kepler(Windows 7)用于在localhost端口80上打开ServerSocket的项目。

我将安全管理器与位于以下位置的策略文件一起使用:

C:\Users\John\Developpement\workspace\security\my.policy


在Eclipse中,对于项目启动配置属性,对于VM参数:

-Djava.security.manager
-Djava.security.policy=${workspace_loc}/security/my.policy


执行的bin文件是(我在Eclipse中使用单独的源文件夹和输出文件夹):

C:\Users\John\Developpement\workspace\SocketApps\bin\TinyHttpd.class


my.policy中:

grant codeBase "file:\C:\Users\John\Developpement\workspace\SocketApps\bin\-" {
    permission java.net.SocketPermission "localhost:80", "listen,resolve";
};


从Eclipse运行时:

Exception in thread "main" java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:80" "listen,resolve")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:372)
    at java.security.AccessController.checkPermission(AccessController.java:559)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.SecurityManager.checkListen(SecurityManager.java:1134)
    at java.net.ServerSocket.bind(ServerSocket.java:375)
    at java.net.ServerSocket.<init>(ServerSocket.java:237)
    at java.net.ServerSocket.<init>(ServerSocket.java:128)
    at TinyHttpd.main(TinyHttpd.java:35)


到达代码时:

ServerSocket ss = new ServerSocket(80));


如果删除codeBase过滤器:

grant {
    permission java.net.SocketPermission "localhost:80", "listen,resolve";
};


问题消失了,所以我想这就是codeBase表示错误的方式。

我已经尝试过为this question提出的解决方案,但是它不起作用。
你能帮助我吗?

最佳答案

既然发现了问题,就回答我自己的问题。
不确定删除该问题是否更好,在我看来,保留该问题将对其他人有所帮助。主持人说。

取自Oracle documentation


  注意:codeBase值是一个URL,因此应始终使用
  斜杠(绝对不要反斜杠)作为目录分隔符,即使
  代码源实际上在Win32系统上。因此,如果来源
  Win32系统上代码的位置实际上是C:\ somepath \ api \,然后
  策略codeBase条目应类似于:


grant codeBase "file:/C:/somepath/api/" {
    ...
}


这是一个初学者的错误。

09-25 22:14