Подтвердить что ты не робот

Почему мой апплет получает java.security.AccessControlException: доступ запрещен (java.net.SocketPermission...) и как его избежать?

Мы не знаем, почему мой клиент сталкивается с исключением безопасности Java в Safari. Может ли кто-нибудь помочь?

Исключение происходит надежно в Safari в Windows. Это включает в себя апплет Java. Исключение также происходит с Firefox и IE8 в Windows Vista.

Вот шаги для воспроизведения:

  • Откройте Safari в Windows

  • Нажмите здесь: http://www.cengraving.com/s/item?itemId=CH003

  • Нажмите "Настроить" (внизу экрана)

  • После загрузки страницы "Мгновенное доказательство" нажмите "Добавить в корзину".

Полная трассировка стека:

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)
4b9b3361

Ответ 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 не может быть использован для этой цели.

Ответ 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.