Почему мой апплет получает java.security.AccessControlException: доступ запрещен (java.net.SocketPermission...) и как его избежать?
Мы не знаем, почему мой клиент сталкивается с исключением безопасности Java в Safari. Может ли кто-нибудь помочь?
Исключение происходит надежно в Safari в Windows. Это включает в себя апплет Java. Исключение также происходит с Firefox и IE8 в Windows Vista.
Вот шаги для воспроизведения:
Полная трассировка стека:
java.security.AccessControlException: access denied (java.net.SocketPermission www.cengraving.com resolve)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkConnect(Unknown Source)
at sun.plugin.security.ActivatorSecurityManager.checkConnect(Unknown Source)
at java.net.InetAddress.getAllByName0(Unknown Source)
at java.net.InetAddress.getAllByName(Unknown Source)
at java.net.InetAddress.getAllByName(Unknown Source)
at java.net.InetAddress.getByName(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
at com.designapplet.a.f.a(Unknown Source)
at com.designapplet.ui.c.a(Unknown Source)
at com.designapplet.ui.c.for(Unknown Source)
at com.designapplet.ui.DesignApplet.buy(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.JSInvoke.invoke(Unknown Source)
at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
at sun.plugin.liveconnect.PrivilegedCallMethodAction.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)
java.net.MalformedURLException: no protocol:
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at sun.plugin.liveconnect.SecureInvocation.checkLiveConnectCaller(Unknown Source)
at sun.plugin.liveconnect.SecureInvocation.access$000(Unknown Source)
at sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)
java.net.MalformedURLException: no protocol:
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at sun.plugin.liveconnect.SecureInvocation.checkLiveConnectCaller(Unknown Source)
at sun.plugin.liveconnect.SecureInvocation.access$000(Unknown Source)
at sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)
Ответы
Ответ 1
Спасибо за ответы. Я не наградил награду, потому что, хотя ответы были полезны, никто не решил проблему.
В конечном итоге я решил проблему, передав данные из апплета на веб-страницу, а затем выполнив вызов AJAX для связи с сервером. Разумеется, это не самое элегантное решение, но оно оказалось эффективным до сих пор.
Попробуйте, и дайте понять, работает ли оно для вас.
Еще раз спасибо!
Ответ 2
Вы можете переопределить файл политики безопасности по умолчанию, используемый SecurityManager.
1) Создайте текстовый файл (например, applet.policy)
2) Предоставьте все разрешения для апплета
grant {
permission java.security.AllPermission;
};
3) Запустите апплет с помощью
-J-Djava.security.policy=applet.policy
Ответ 3
У меня была та же проблема. И решил это, сам подписывая апплет...
использовали следующие шаги, и он работал
javac AppletClass.java
jar cvf AppletClass.jar AppletClass.class
keytool -genkey -validity 3650 -keystore pKeyStore -alias keyName
keytool -selfcert -keystore pKeyStore -alias keyName-validity 3650
jarsigner -keystore pKeyStore AppletClass.jar keyName
просто ответьте на вопросы, которые он попросит, и он выполнит работу
ПРИМЕЧАНИЕ: я получал ошибку для локального файла чтения/записи
Ответ 4
У меня такая же проблема! JavaScript вызывает общедоступный метод апплета, который встроен в один и тот же документ. Это должно спровоцировать, что апплет загружает некоторые данные из "дома", поэтому соединение должно быть открыто в том же домене, откуда был загружен апплет, - который также должен быть разрешен для беззнаковых апплетов без дополнительных привилегий.
Я также признал это исключение безопасности только с Safari (5.0.2 для Windows, JRE 1.6.0_22). Тот же апплет в IE и FireFox преуспевает.
Я также считаю, что это ошибка в Java Sandbox Safari.
EDIT:
Использование doPrivileged не помогло, но я нашел это обходное решение:
Если вы "отделите" вызов JavaScript от запрошенного выполнения через событие таймера, выполнение больше не будет запрещено ограничением безопасности, которое Safari помещает в игру здесь. Подробнее:
- метод, который вызывается из JavaScript, создает javax.swing.Timer(чтобы запланировать одно событие, поэтому свойство repeat-свойство должно быть установлено false). Вы можете установить задержку довольно короткой (например, 50 мс).
- Вызов метода, который должен быть вызван, должен быть помещен в прослушиватель ActionEvent (actionPerformed), который вызывается таймером.
Одна из проблем, которая может усложнить ситуацию, заключается в том, что в контексте actionPerformed доступны только статические переменные. Если вызов JavaScript содержит переменные, они должны быть помещены первоначально вызванным методом в старую "буферную" переменную, из которой запланированное событие может прочитать значение впоследствии.
В моих тестах только javax.swing.Timer предоставил требуемую развязку, тогда как java.util.Timer не может быть использован для этой цели.
Ответ 5
Это апплет? Если это так, вам нужно подписать апплет для доступа к сокету (что, кажется, то, что вы делаете...)
См. здесь дополнительную информацию:
http://java.sun.com/developer/onlineTraining/Programming/JDCBook/signed.html
Ответ 6
Это проявляется как исключение безопасности, но проблема в самом деле является плохим URL-адресом. Если вы следуете за стеком, вы увидите, что есть ошибка MalformedURLException.
Это, скорее всего, связано с передачей URI где-то, ожидающим URL. Через API LiveConnect из внешнего вида. Я предполагаю, что он не найдет имя хоста, где его ожидают, и пытается подключиться к умолчанию, возможно, localhost. Это запретило бы SecurityManager, следовательно, SecurityException.
В href вы можете использовать URI (например, href= "/somepath" ), потому что браузер разрешает это против URL-адреса самой страницы для создания полного URL-адреса (например, http://example.com/somepath).
Вы можете сделать это на Java с помощью [подходящего конструктора URL] [1].
Update:
Ах, я неправильно понял; Я думал, что это была одна трассировка стека.
Там была ошибка, в которой liveconnect мог получить доступ к jar: url и получить произвольное соединение сокета. Исправить это может возникнуть проблема с открытием соединений url из потока liveconnect. Что произойдет, если в методе buy
вы запускаете поток для выполнения соединения?
[1]: http://download.oracle.com/javase/6/docs/api/java/net/URL.html#URL(java.net.URL, java.lang.String)
Ответ 7
В Linux он работает.
Кнопка Add to cart
выполняет функцию
function saveLayout() {
showSaveMsg();
var status = document.app.buy();
var loc = "http://www.cengraving.com/s/cart";
if (status == 'GOOD') {
window.location = getCartUrl();
} else {
showErrorMsg(status);
}
}
Некоторые замечания:
-
Нормально ли, что локальный var loc
определяется после вызова приложения и не используется в любом случае?
-
Кроме того, a try
catch
может помочь (в Javascript, обертывании вызова app.buy()
).
-
Кроме того, я провел несколько исследований в Сети, а некоторые люди - с той же ошибкой, но из другого использования - сообщили о проблеме ClassPath
. У вас есть что-то конкретное, что может помешать использованию соответствующей JRE?
Ответ 8
Песочница JRE пытается предотвратить вызовы метода, инициированные javascript, чтобы делать вредные вещи, но только то, что он делает, делает жизнь программистов более сложной.
Наилучшее обходное решение, которое я нашел для этого, заключается в создании очереди событий шаблона производителя и потребителя, которая реализует очень свободную связь между инициированными javascript вызовами и фактической "грязной работой".
Что действительно отстой, так это то, что код, который отлично работает в XP или Win7, может вызвать исключение в Vista.