Как избежать java.security.AccessControlException через jtwitter (Twitter API) из Java-апплета - PullRequest
2 голосов
/ 27 января 2010

Я пишу простой апплет (мой первый), чтобы получить самый последний статус из учетной записи Twitter. Это прекрасно работает при запуске из javaw.exe, запущенного из затмения. Однако при запуске из браузера я получаю сообщение об ошибке:

java.security.AccessControlException: доступ запрещен (java.net.SocketPermission twitter.com:80 подключиться, разрешить)

Какой-нибудь совет, как этого избежать?

Звонок:

private void updateStatus() {
    try {
        Twitter client = new Twitter("user", "pw");
        Status status = client.getStatus();
        addItem(status.toString());
    }
    catch (Throwable t) {
        addItem(t.getMessage());
    }
}

Соединение с клиентом установлено успешно. Это вызов getStatus (), который вызывает исключение. Я заметил, что eclipse добавляет «-Djava.security.policy = java.policy.applet» к javaw.exe, не уверен, что это как-то связано с тем, почему он работает из eclipse, а не из браузера. К сожалению, я попытался запустить ту же команду javaw.exe напрямую с теми же параметрами CL и PATH, которые успешно использует eclipse. Тем не менее, когда я запускаю его непосредственно, javaw.exe завершает работу немедленно. jtwitter - это простая оболочка в Twitter API.

Ответы [ 2 ]

2 голосов
/ 27 января 2010

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

Чтобы решить эту проблему, вы должны подписать апплет. Подписанный апплет может работать с обычными разрешениями безопасности. Для этого вам нужно создать сертификат безопасности и подписать апплет с помощью jarsigner .

Не нужно покупать дорогие сертификаты, по крайней мере, если это небольшой личный проект. Подойдет самозаверяющий сертификат (единственная проблема в том, что в браузере появится сообщение «сертификат не может быть подтвержден» или что-то в этом роде).

См. Также: Учебник по подписанному апплету

0 голосов
/ 16 июня 2010

@ Дейв

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

final String googleUrl = "www.google.com"
URL url = (URL) AccessController.doPrivileged(new PrivilegedAction() 
    {
        public Object run() 
        {
            try
            {
                return new URL(googleUrl);
            }
            catch (MalformedURLException e)
            {
                e.printStackTrace();
                return null;
            }
        }  
    });  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...