апплет. java.lang.reflect.InvocationTargetException - PullRequest
4 голосов
/ 05 августа 2011

У меня есть апплет, который использует класс jna Pointer.Код апплета:

import com.sun.jna.*;
public class Applet1 extends Applet{
    public void test() {
        try {
            Pointer p = new Memory(73);
        } catch (Exception e) {
        e.printStackTrace();
        }
    }
}

В HTML-коде я объявил апплет следующим образом:

<applet
    codebase=/pki/
    code=Applet1.class 
    archive=/pki/jna-3.2.3.jar
    id=Applet1
    width=100 
    height=100 >
</applet>

Когда я вызываю document.getElementById ("Applet1"). Test () с помощью javascriptjava.lang.reflect.InvocationTargetException возникают.Я не могу вызвать e.getCause () на стороне класса java, потому что апплет try / catch не улавливает ошибку (я не понимаю, почему).Но javascript try / catch ловит эту ошибку.Если переместить Pointer p = new Memory(73); линию, все будет в порядке.Дело в этой линии.Пожалуйста, помогите решить проблему.

РЕДАКТИРОВАТЬ: если заменить этот блок:

try {
    Pointer p = new Memory(73);
} catch (Exception e) {
    e.printStackTrace();
}

на

try {
    Pointer p = new Memory(73);
} catch (Throwable e) {
    System.out.println(e.getCause());
}

Я получил java.security.AccessControlException: доступ запрещен(java.util.PropertyPermission jna.boot.library.path читать)

1 Ответ

7 голосов
/ 06 августа 2011

Хорошо, теперь мы подошли к корню проблемы. (Вы все еще могли бы использовать printStackTrace - это должно было бы также напечатать трассировку стека cause.).

  1. Неподписанные апплеты имеют доступ только к ограниченному количеству системных свойств - свойства jna не являются их частью.

  2. В неподписанном апплете вы все равно не можете загружать нативные библиотеки, поэтому нельзя использовать JNA (или, кстати, JNI).

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

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

    Вы можете обойти это, обернув часть кода, которая должна выполняться с разрешениями вашего апплета, с AccessController.doPrivileged(...). Но сначала убедитесь, что это не может сделать ничего опасного (что легко с JNI / JNA), даже если вызывается из вредоносного кода JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...