Почему мой апплет не может загрузить собственную библиотеку при доступе к методам с помощью JavaScript?

У меня есть апплет для сканирования документов (используя JTwain). Мой апплет состоит из написанного мною jar-файла, пары сторонних jar-файлов и dll (завернутой в jar-файл JTwain). Я намерен загрузить апплет, а затем получить доступ к методам апплета с помощью JavaScript. Однако я получаю исключение безопасности, когда делаю это:

java.security.AccessControlException: access denied (java.lang.RuntimePermission loadLibrary.AspriseJTwain)
    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.checkLink(Unknown Source)
    at java.lang.Runtime.loadLibrary0(Unknown Source)
    at java.lang.System.loadLibrary(Unknown Source)
    at com.asprise.util.jtwain.SourceManager.init(SourceManager.java:222)
    at com.asprise.util.jtwain.SourceManager.<init>(SourceManager.java:36)
    at com.asprise.util.jtwain.SourceManager.instance(SourceManager.java:28)
    at co.altcom.cache.scanner.CacheScan.scanToPDF(CacheScan.java:91)
    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.GeneratedMethodAccessor3.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.plugin2.liveconnect.JavaClass$MethodInfo.invoke(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass$MemberBundle.invoke(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass.invoke0(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass.invoke(Unknown Source)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$DefaultInvocationDelegate.invoke(Unknown Source)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo.doObjectOp(Unknown Source)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$LiveConnectWorker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Что меня смущает, так это то, что я могу нормально запускать эти функции из метода инициализации апплета (без исключений - апплет сканирует и сохраняет в файловой системе компьютера). Только когда к ним обращается JavaScript, они терпят неудачу. Я предполагаю, что мне нужно установить какую-то политику, но я ничего не могу найти об этом.

Есть идеи?


person Aidan Ewen    schedule 12.08.2011    source источник


Ответы (1)


Оберните код, вызываемый JS, в AccessController.doPrivileged(PrivilegedAction) (или перегруженный вариант).

person Andrew Thompson    schedule 12.08.2011
comment
Блестящий. Именно то, что я искал. Спасибо. - person Aidan Ewen; 12.08.2011