java - 使用 Javascript 函数调用签名的小程序 : Initialization Error on IcedTea plugin

标签 java javascript security applet japplet

我正在尝试从我开发的 Java 签名 Applet 内部调用 Javascript 函数。当我使用带有 Sun Java 插件的浏览器时,效果非常好。我在 Windows 7 和 Ubuntu 10.04 上使用 Firefox、Chrome 和 Internet Explorer (Windows) 浏览器进行了测试。

当我尝试在带有 Iced Tea 插件的任何浏览器上运行相同的代码时,会出现以下错误:

<小时/>

net.sourceforge.jnlp.LaunchException: Fatal: Initialization Error: Could not initialize applet. at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:735) at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:676) at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:886)Caused by: java.lang.NullPointerException at net.sourceforge.jnlp.runtime.JNLPClassLoader.getPermissions(JNLPClassLoader.java:915) at java.security.SecureClassLoader.getProtectionDomain(SecureClassLoader.java:206) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:447) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at net.sourceforge.jnlp.runtime.JNLPClassLoader.findClass(JNLPClassLoader.java:1499) at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClassExt(JNLPClassLoader.java:1526) at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClass(JNLPClassLoader.java:1341) at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2442) at java.lang.Class.getDeclaredMethod(Class.java:1952) at java.awt.Component.isCoalesceEventsOverriden(Component.java:6190) at java.awt.Component.access$500(Component.java:188) at java.awt.Component$3.run(Component.java:6144) at java.awt.Component$3.run(Component.java:6142) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Component.checkCoalescing(Component.java:6141) at java.awt.Component.(Component.java:6110) at java.awt.Container.(Container.java:276) at java.awt.Panel.(Panel.java:64) at java.awt.Panel.(Panel.java:56) at java.applet.Applet.(Applet.java:65) at javax.swing.JApplet.(JApplet.java:130) at br.ufrj.land.tangram.measures.NetworkMeasurerApplet.(NetworkMeasurerApplet.java:11) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at java.lang.Class.newInstance0(Class.java:372) at java.lang.Class.newInstance(Class.java:325) at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:726) ... 2 more Caused by: java.lang.NullPointerException at net.sourceforge.jnlp.runtime.JNLPClassLoader.getPermissions(JNLPClassLoader.java:915) at java.security.SecureClassLoader.getProtectionDomain(SecureClassLoader.java:206) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:447) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at net.sourceforge.jnlp.runtime.JNLPClassLoader.findClass(JNLPClassLoader.java:1499) at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClassExt(JNLPClassLoader.java:1526) at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClass(JNLPClassLoader.java:1341) at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2442) at java.lang.Class.getDeclaredMethod(Class.java:1952) at java.awt.Component.isCoalesceEventsOverriden(Component.java:6190) at java.awt.Component.access$500(Component.java:188) at java.awt.Component$3.run(Component.java:6144) at java.awt.Component$3.run(Component.java:6142) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Component.checkCoalescing(Component.java:6141) at java.awt.Component.(Component.java:6110) at java.awt.Container.(Container.java:276) at java.awt.Panel.(Panel.java:64) at java.awt.Panel.(Panel.java:56) at java.applet.Applet.(Applet.java:65) at javax.swing.JApplet.(JApplet.java:130) at br.ufrj.land.tangram.measures.NetworkMeasurerApplet.(NetworkMeasurerApplet.java:11) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at java.lang.Class.newInstance0(Class.java:372) at java.lang.Class.newInstance(Class.java:325) at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:726) at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:676) at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:886)java.lang.NullPointerException at net.sourceforge.jnlp.NetxPanel.runLoader(NetxPanel.java:154) at sun.applet.AppletPanel.run(AppletPanel.java:379) at java.lang.Thread.run(Thread.java:722) java.lang.NullPointerException at sun.applet.AppletPanel.run(AppletPanel.java:429) at java.lang.Thread.run(Thread.java:722)

<小时/>

我尝试过的配置和事情:

  • 我与 Iced Tea 插件一起使用的 Linux 版本是 Ubuntu 12.04

  • 我尝试使用 Sun JDK 6 和 7 以及 Open JDK 6 和 7 编译代码,但在浏览器上使用 Iced Tea 插件时均失败。

  • 我用 Iced Tea 版本 6 和版本 7 尝试了我的代码

  • 我在 Ubuntu 上使用 Firefox 和 Chrome 浏览器尝试了我的代码

代码片段:

HTML(正文标记内):

    <!-- JavaScript File That Contains My Javascript Function -->
    <script type="text/javascript" src="./my_javascript_file.js"></script>

    <!-- Applet That Will Call My Javascript Function -->
    <object height="1" width="1" id="MyApplet" name="MyApplet"
    java_version="1.5+" type="application/x-java-applet">
        <param name="code" value="foo.MyApplet" />
        <param name="archive" value="MyApplet.jar" />
        <param name="JVM_PARAM" value="-Djava.security.policy=applet.policy" />
        <param name="mayscript" value="true" />
        <param name="scriptable" value="true" />
        <param name="name" value="MyApplet" />
    </object>

我尝试调用的 Javascript 方法(在 my_javascript_file.js 中):

window.performAppletCode = function (parameter_1) {
    //Function code
}

“MyApplet.jar”内的Java applet代码(相关部分):

package foo;

import java.util.Arrays;
import javax.swing.JApplet;
import netscape.javascript.JSException;
import netscape.javascript.JSObject;

public class MyApplet extends JApplet {

    //Parameter that will be sent to Javascript function    
    public String parameter_1;    
    //JSObject that will be responsible for accessing javascript on my page 
    public JSObject window = null;
    private Thread myThread;
    private ImportantClass importantClassInstance;

    @Override
    public void init() {

    }

    @Override
    public void start() {
        if (this.window == null) {
            try {
                this.window = JSObject.getWindow(this);
                if (this.window == null){
                    System.out.println("Window is null");
                }
            }
            catch (JSException jse) {
                jse.printStackTrace();
            }
            fooStart();
        }
    }


    public void fooStart() {

            importantClassInstance = new ImportantClass();

            // MyThread Section
            myThread = new Thread(new Runnable() {
                @Override
                public void run() {

                    // Run latency test.
                    int[] fooArray = importantClassInstance.fooMethod();
                    parameter_1 = Arrays.toString(fooArray);
                    //Javascript function call
                    window.call("performAppletCode", new Object[] {parameter_1});
                }
            });
            myThread.start();
    }
}

我的小程序使用 jarsigner 进行签名,并且证书包含在我的 HTML 目录中。

如果有人知道解决此问题的可能线索,请告诉我。

谢谢, 吉列尔梅。

最佳答案

当从 JS 调用时,小程序会失去信任。要解决此问题,请参阅 AccessController.doPrivileged(...)this answer .

关于java - 使用 Javascript 函数调用签名的小程序 : Initialization Error on IcedTea plugin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11533235/

相关文章:

java - 为什么这个数组已经初始化了却为空?

javascript - 选择和更改

c# - ASP.NET WebApi - 如何获得 "allow"而不是 "require"客户端证书?

java - Groovy Spring @Configuration 使用 @ComponentScan 与多个包

java - opencv Mat 对象

java - StreamEx 分组为列表返回不正确的记录数

javascript - jQuery 工具范围从本地 javascript 输入加载

javascript - ExtJS - 更新 DIV 后无法再次渲染窗口

security - Maven 包签名或您如何信任/验证 Maven Central Artifact 的完整性和真实性?

security - XMLHttpRequest 无法加载文件。跨源请求仅支持 HTTP