为什么我的applet在通过JavaScript访问方法时无法加载本机库?

时间:2011-08-12 12:16:42

标签: javascript security applet loadlibrary

我有一个用于扫描文档的小程序(使用JTwain)。我的applet由我写的一个罐子,几个第三方罐子和一个dll(包裹在JTwain罐子里)组成。我打算加载applet,然后使用JavaScript访问applets方法。但是,当我这样做时,我得到一个安全例外:

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)

让我感到震惊的是,我可以在applets init方法中运行这些函数就好了(没有例外 - applet扫描并保存到计算机文件系统中)。只有当他们被JavaScript访问时才会失败。我猜我需要设置一些政策,但我找不到任何相关内容。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

将JS调用的代码包含在AccessController.doPrivileged(PrivilegedAction)(或重载的变体)中。

相关问题