Я везде читал, что неподписанным Java-апплетам не разрешается устанавливать сетевые подключения ни к одному серверу, кроме того, на котором был создан апплет. Это нормально для моего приложения, так как мой апплет должен только общаться с сервером. Однако когда я написал тестовый апплет, чтобы попытаться открыть сокет для связи с процессом на моей машине разработки, он выдает следующее исключение:
Error establishing socket connection:
java.security.AccessControlException:
access denied (java.net.SocketPermission 127.0.0.1:11000 connect,resolve)
Код, вызвавший исключение:
private void sendMsg(String msg) {
Socket s = null;
try {
s = new Socket("localhost", 11000);
}
catch (Exception e) {
System.err.println("Error establishing socket connection:");
e.printStackTrace();
return;
}
try {
OutputStream out = s.getOutputStream();
out.write(msg.getBytes());
out.flush();
s.shutdownOutput();
s.close();
}
catch (Exception e) {
System.err.println("Error in writing to the socket:");
e.printStackTrace();
}
Сначала я подумал, что в моем коде есть проблема, из-за которой моя неопытность заставила меня пропустить. Однако я получаю то же исключение при попытке запустить пример Talk Server из официальных учебников по Java. Это заставляет меня поверить, что у меня действительно есть проблема с настройкой или неправильное понимание ограничений безопасности по умолчанию. Предотвращает ли менеджер безопасности по умолчанию открытие сокетов на машине, на которой запущен апплет, даже если это также машина, обслуживающая апплет? Если это так, то это проблема для меня, потому что развернутая система должна позволять пользователю, вошедшему в систему на фактическом сервере, использовать тот же апплет, что и удаленный пользователь. Есть ли способ обойти исключение, которое я получаю, которое не включает в себя подписание апплета? Я не хочу идти на неприятности, если в этом нет необходимости.
ПРИМЕЧАНИЕ: Я знаю, что было бы лучше, чтобы пользователи не обращались к апплету с сервера. Это был не оригинальный дизайн, но, к сожалению, практические соображения вынудили меня пойти на компромисс.
ОБНОВЛЕНИЕ: Просмотр страницы апплета с веб-сервера решает проблему. Даже если сервер является локальным. Обновление безопасности в Java 1.6.0_11 применяется только к апплетам, загружаемым непосредственно из локальной файловой системы.