1

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

当我尝试在任何带有冰茶插件的浏览器上运行相同的代码时,会收到以下错误消息:


net.sourceforge.jnlp.LaunchException:致命:初始化错误:无法初始化小程序。在 net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:735) 在 net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:676) 在 net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java :886) 由:java.security.SecureClassLoader.getProtectionDomain(SecureClassLoader.java:206) 处的 net.sourceforge.jnlp.runtime.JNLPClassLoader.getPermissions(JNLPClassLoader.java:915) 处的 java.lang.NullPointerException 引起。 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) 在 java.net.URLClassLoader$1。


我尝试过的配置和事情:

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

  • 我尝试使用 Sun JDK 6 和 7 以及 Open JDK 6 和 7 编译我的代码,但都因浏览器上的 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 小程序代码(相关部分):

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 目录中。

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

谢谢,吉尔赫姆。

4

2 回答 2

1

当从 JS 调用时,applet 会失去信任。要解决这个问题,请参阅AccessController.doPrivileged(...)这个答案

于 2012-07-18T01:55:42.643 回答
0

我想我找到了解决方案,但我仍然不知道为什么会发生这种情况。事情是这样的:

当我从位于我的操作系统 Ubuntu 上的目录中启动我的网页(带有小程序和其他所有内容)时,我的 Java 控制台上会弹出这个疯狂的错误。但是,当我从位于远程服务器上的目录(例如,我家局域网中的另一台计算机)开始我的页面时,一切正常。因此,出于某种原因,我需要从某个远程服务器请求我自己的页面,以使一切正常。这只发生在我的问题中描述的上述情况。我会在网上搜索,试图找出发生这种情况的原因。

于 2012-08-07T14:59:22.617 回答