1

我去年创建了一个 Java 小程序,用于从 Web 应用程序到本地运行的 Java 服务器的套接字连接。它工作得很好。

自上次 java 更新(我猜是 7 r21)以来,我无法再访问 javascript 中的方法。现在,我将小程序简化为测试小程序(没有 doPriviligedAction 方法),但即使这样也不再起作用。

当前的代码就像

import java.applet.*;

public class socketApplet extends Applet {

    public void init() {
        System.out.println("Applet initialisiert.");
    }

    public void start() {
        System.out.println("Applet gestartet.");
    }

    public void paint() {
        System.out.println("Applet aktualisiert.");
    }

    public void stop() {
        System.out.println("Applet angehalten.");
    }

    public void destroy() {
        System.out.println("Applet beendet.");
    }

    public String testApplet() {
        System.out.println("Applet getestet.");
        return "Yep, I'm the Applet.";
    }

}

在更新之前,我可以像这样在 javascript 中访问 testApplet() 之类的方法:

document.socketApplet.testApplet();

该小程序是自签名的,并嵌入了一个小程序 html 标记。它正在启动(Java 控制台正在打开并打印在 init、start 和 paint 方法中定义的调试消息),但我无法访问 testApplet() 方法。当小程序存在时,Javascript 中的响应是“未定义的”。

在阅读了一段时间(现在几天......)关于新的安全更改之后,我添加了一个 manifest.txt 包含以下内容:

Main-Class: socketApplet
Permissions: all-permissions
Codebase: *
Trusted-Library: true

不管有没有 Trusted-Library 属性,都没有运气。

我必须做什么才能再次启用使用 javascript 的访问?

编辑:实现:

<applet id="socketApplet" width="100" height="100" archive="../../socketApplet.jar" name="socketApplet" code="socketApplet" scriptable="true">

我在最新的 Mac OS X 机器上使用最新版本的 Firefox 和 Safari 进行测试。

Edit2:我正在像这样创建和签署 jar 在此处输入图像描述

Edit3:好的,现在我的罐子工作了几次(不是连续工作),我得到了 在此处输入图像描述

在控制台中 在此处输入图像描述

但大多数时候它不起作用。重新启动浏览器,清除缓存,没有任何效果。现在(再次)要在另一台电脑上测试这个。

Edit4:好的,它运行在带有 windows xp 和 java 32 位 7u25 的虚拟机上——在我的 64 位 mac 上,30 次尝试中只有 1 次。

4

1 回答 1

1

好吧,我找到了万恶之源……

它与小程序无关。令人困惑的情况是它在windows上的firefox中工作,而不是在mac上的firefox(相同的FF版本,相同的java版本)。我的 Mac 上的 Safari 无法正常工作,因为该插件已被禁用...

所以这只是 Mac 上的 Firefox 问题。我已经测试了不同的情况,并且在将上面的小程序代码写入 html 页面时,小程序可以正常工作。之前,我已经动态创建了小程序(软件中需要什么):

    var applet = document.createElement('applet');

    applet.archive      = 'socketApplet.jar';
    applet.id           = 'socketApplet';
    applet.name         = 'socketApplet';
    applet.code         = 'socketApplet';
    applet.scriptable   = 'true';
    applet.width        = '0';
    applet.height       = '0';

    document.body.appendChild(applet);

它适用于任何地方,但不适用于 Mac 上的 Firefox。因此,作为一种解决方法,我必须将小程序嵌入 iframe 中,并且必须动态嵌入 iframe。这样可行...

    var mFrame      = document.createElement('iframe');
    mFrame.id       = 'testFrame';
    mFrame.height   = '200';
    mFrame.width    = '400';
    document.body.appendChild(mFrame);
    mFrame.src      = 'frame.html'; // contains the applet code

接下来我要将 html 标签更改为对象并嵌入标签以支持 IE。感谢您的帮助安德鲁汤普森!

我不喜欢 iframe 版本,因为通过 javascript 访问小程序更复杂,但似乎没有其他方法。

我将为此提交一份 Mozilla bug 票。 https://bugzilla.mozilla.org/show_bug.cgi?id=912880

也许类似于这个但另一种情况: https ://bugzilla.mozilla.org/show_bug.cgi?id=872969

于 2013-09-05T07:44:53.130 回答