Исключение: доступ запрещен ("java.net.SocketPermission" "localhost:80", "прослушать, разрешить")

Использование Eclipse Kepler (Windows 7) для проекта, который открывает ServerSocket на localhostпорт 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 выражается, что это неправильно.

Я попробовал решение, предложенное для этого вопроса, но оно не работает. Вы можете мне помочь?

1 ответ

Решение

Отвечая на мой собственный вопрос, так как я нашел, в чем проблема. Не уверен, что лучше снять вопрос, мне кажется, что его поддержание поможет другим людям. Модераторы сказать.

Взято из документации Oracle:

Примечание. Значение codeBase - это URL-адрес, поэтому в качестве разделителя каталогов всегда следует использовать косую черту (а не обратную косую черту), даже если исходный код на самом деле находится в системе Win32. Таким образом, если исходным местоположением для кода в системе Win32 является C:\somepath\api\, то запись codeBase политики должна выглядеть следующим образом:

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

Это ошибка новичка.

Другие вопросы по тегам