【问题标题】:How can I call Java applet methods with Javascript?如何使用 Javascript 调用 Java 小程序方法?
【发布时间】:2013-09-03 09:01:33
【问题描述】:

我去年创建了一个 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 进行测试。

编辑2: 我正在像这样创建和签署 jar

编辑3: 好的,现在我的罐子工作了几次(不是连续工作),我得到了

在控制台中

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

编辑4: 好的,它正在使用 windows xp 和 java 32 位 7u25 的虚拟机上运行 - 在我的 64 位 mac 上,30 次尝试中只有 1 次。

【问题讨论】:

  • 在什么版本的浏览器中进行测试?用于启动小程序的 HTML 是什么?
  • 为了快速响应,我更新了主帖(见最后的编辑部分)
  • 建议:1) 使小程序的宽度和高度不为零。网页中的 0x0 元素是自动可疑的,这可能会触发浏览器中更高级别的安全性,或者浏览器安装的任何工具来查找可疑活动。 2) 添加scriptable="true" 属性以指示小程序可能是从Javascript 调用的。
  • ty 但还是同样的问题
  • 呵呵.. this Oracle page 在那些浏览器中工作吗?

标签: java javascript applet


【解决方案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 错误票。 https://bugzilla.mozilla.org/show_bug.cgi?id=912880

可能与此类似,但另一种情况: https://bugzilla.mozilla.org/show_bug.cgi?id=872969

【讨论】:

猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2012-12-10
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多