1

localhost将 Eclipse Kepler (Windows 7) 用于在, port上打开 ServerSocket 的项目80

我使用带有策略文件的安全管理器,位于:

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是错误的表达方式。

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

4

1 回答 1

1

回答我自己的问题,因为我发现了问题所在。不确定是否最好删除这个问题,在我看来,保留它会帮助其他人。版主说。

取自Oracle 文档

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

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

这是初学者的错误。

于 2014-07-13T13:28:26.547 回答