我去年创建了一个Java applet,用于从Web应用程序到本地运行的java服务器的套接字连接。它运作良好。
自上次java更新(我猜是7 r21)以来,我无法再访问javascript中的方法了。现在,我将applet缩减为测试applet(没有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();
applet是自签名的,并嵌入了applet html-tag。它正在启动(java控制台打开并打印init,start和paint方法中定义的调试消息)但我无法访问testApplet()方法。当applet存在时,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 32bit 7u25的虚拟机上 - 在我的64位mac上只有30次尝试中只有1次。
答案 0 :(得分:1)
好的,我找到了所有邪恶的根源......
它与applet无关。令人困惑的情况是它在Windows上的firefox中工作,而不是在mac上的firefox中工作(相同的FF版本,相同的java版本)。我的Mac上的Safari无法正常工作,因为该插件已被禁用...
所以这只是一个关于mac问题的Firefox。我已经测试了不同的情况,并且applet在将上面的applet代码编写到html页面时起作用。之前,我已经动态创建了applet(在软件中需要什么):
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。因此,作为一种解决方法,我必须将applet嵌入到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支持标签。谢谢你的帮助Andrew Thompson!
我不喜欢iframe版本,因为通过javascript访问applet更复杂,但似乎没有别的办法。
我将为此提交一张Mozilla错误票。 https://bugzilla.mozilla.org/show_bug.cgi?id=912880
可能与此类似但另一种情况: https://bugzilla.mozilla.org/show_bug.cgi?id=872969