我提到了一个小演示。在为嵌入在 HTML中的Applet和Iced Tea JRE用户设置策略中, 该演示对该示例进行了评论。他们失败了。他们拒绝了对applet的许可(因此 将其限制在沙盒中),并且应该看到绿色的 “此applet是沙盒”页面。相反,该小程序完全失败了, 他们看到了该小程序应该所在的“灰色空间”。
我警告说,它试图实例化一个 与众不同的File对象 。IE Sun / Oracle JRE将允许它没有问题,仅 在applet尝试创建时抛出安全异常 JFileChooser。OTOH冰茶JRE不允许File创建。
因此,此代码应解决该问题。它移动创建/加入 了JEditorPane和安装1日的的“一切都失败了”的消息,则在之前的绿色“沙箱”页面,以new File(..)呼叫。
我的问题是。对于使用Iced TeaJRE的用户,此代码是否“按广告样工作” ?
要测试它:
访问位于的小程序 pscode.org /test/docload/applet-latest.html拒绝数字签名的代码。这对于创建测试Applet的正确条件非常重要。观察/报告小程序是否加载了绿色的sandbox.html。沙盒文档表示修复该错误的“成功”。同样感兴趣的(小有可能是什么)是网页的演示可信的applet的防守加载,它链接到applet的网页,每个HTML文件显示在小程序, 并包含源的ZIP档案代码和HTML,以及一个Antbuild.xml,这样您就可以“孩子们在家做”。
这是新代码。
Here is the new code.
package org.pscode.eg.docload; import java.awt.BorderLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JFileChooser; import java.net.URL; import java.net.MalformedURLException; import java.io.File; import java.io.IOException; import java.security.AccessControlException; /** An applet to display documents that are JEditorPane compatible. This applet loads in a defensive way in terms of the security environment, in case the user has refused to accept the digitally signed code. */ public class DocumentLoader extends JApplet { JEditorPane document; @Override public void init() { System.out.println("init()"); JPanel main = new JPanel(); main.setLayout( new BorderLayout() ); getContentPane().add(main); document = new JEditorPane("text/html", "<html><body><h1>Testing</h1><p>Testing security environment.."); main.add( new JScrollPane(document), BorderLayout.CENTER ); System.out.println("init(): entering 'try'"); try { // set up the green 'sandboxed URL', as a precaution.. URL sandboxed = new URL(getDocumentBase(), "sandbox.html"); document.setPage( sandboxed ); // It might seem odd that a sandboxed applet can /instantiate/ // a File object, but until it goes to do anything with it, the // JVM considers it 'OK'. Until we go to do anything with a // 'File' object, it is really just a filename. System.out.println("init(): instantiate file"); File f = new File("."); System.out.println("init(): file instantiated, create file chooser"); // Everything above here is possible for a sandboxed applet // *test* if this applet is sandboxed final JFileChooser jfc = new JFileChooser(f); // invokes security check jfc.setFileSelectionMode(JFileChooser.FILES_ONLY); jfc.setMultiSelectionEnabled(false); System.out.println( "init(): file chooser created, " + "create/add 'Load Document' button"); JButton button = new JButton("Load Document"); button.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent ae) { int result = jfc.showOpenDialog( DocumentLoader.this); if ( result==JFileChooser.APPROVE_OPTION ) { File temp = jfc.getSelectedFile(); try { URL page = temp.toURI().toURL(); document.setPage( page ); } catch(Exception e) { e.printStackTrace(); } } } } ); main.add( button, BorderLayout.SOUTH ); // the applet is trusted, change to the red 'welcome page' URL trusted = new URL(getDocumentBase(), "trusted.html"); document.setPage(trusted); } catch (MalformedURLException murle) { murle.printStackTrace(); document.setText( murle.toString() ); } catch (IOException ioe) { ioe.printStackTrace(); document.setText( ioe.toString() ); } catch (AccessControlException ace) { ace.printStackTrace(); // document should already be showing sandbox.html } } @Override public void start() { System.out.println("start()"); } @Override public void stop() { System.out.println("stop()"); } @Override public void destroy() { System.out.println("destroy()"); } }
以下是输出java.stderr(相当于Java 控制台的一半-另一半是java.stdout,在您的情况下为空):
java.stderr
java.stdout
net.sourceforge.jnlp.LaunchException: Fatal: Initialization Error: Could not initialize applet. at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:604) at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:548) at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:729) Caused by: net.sourceforge.jnlp.LaunchException: Fatal: Launch Error: Jars not verified. at net.sourceforge.jnlp.runtime.JNLPClassLoader.checkTrustWithUser(JNLPClassLoader.java:467) at net.sourceforge.jnlp.runtime.JNLPClassLoader.initializeResources(JNLPClassLoader.java:410) at net.sourceforge.jnlp.runtime.JNLPClassLoader.<init>(JNLPClassLoader.java:168) at net.sourceforge.jnlp.runtime.JNLPClassLoader.getInstance(JNLPClassLoader.java:249) at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:575) ... 2 more Caused by: net.sourceforge.jnlp.LaunchException: Fatal: Launch Error: Jars not verified. at net.sourceforge.jnlp.runtime.JNLPClassLoader.checkTrustWithUser(JNLPClassLoader.java:467) at net.sourceforge.jnlp.runtime.JNLPClassLoader.initializeResources(JNLPClassLoader.java:410) at net.sourceforge.jnlp.runtime.JNLPClassLoader.<init>(JNLPClassLoader.java:168) at net.sourceforge.jnlp.runtime.JNLPClassLoader.getInstance(JNLPClassLoader.java:249) at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:575) at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:548) at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:729) java.lang.NullPointerException at net.sourceforge.jnlp.NetxPanel.runLoader(NetxPanel.java:99) at sun.applet.AppletPanel.run(AppletPanel.java:380) at java.lang.Thread.run(Thread.java:636) java.lang.NullPointerException at sun.applet.AppletPanel.run(AppletPanel.java:430) at java.lang.Thread.run(Thread.java:636) java.lang.Exception: Applet initialization timeout at sun.applet.PluginAppletViewer.handleMessage(PluginAppletViewer.java:637) at sun.applet.PluginStreamHandler.handleMessage(PluginStreamHandler.java:270) at sun.applet.PluginMessageHandlerWorker.run(PluginMessageHandlerWorker.java:82) java.lang.RuntimeException: Failed to handle message: handle 60822154 for instance 2 at sun.applet.PluginAppletViewer.handleMessage(PluginAppletViewer.java:660) at sun.applet.PluginStreamHandler.handleMessage(PluginStreamHandler.java:270) at sun.applet.PluginMessageHandlerWorker.run(PluginMessageHandlerWorker.java:82) Caused by: java.lang.Exception: Applet initialization timeout at sun.applet.PluginAppletViewer.handleMessage(PluginAppletViewer.java:637) ... 2 more
因此,如果我在 对话框中按“取消”,则看起来甚至没有加载您的applet代码 。
我认为您在Java方面无能为力-也许使用其他签名过程或通过JNLP启动applet会有所帮助。或在IcedTea上提交错误报告。
为了演示这一点,我通过省略了小应用程序中的所有关键内容,创建了一个真正的简单小应用程序:
package org.pscode.eg.docload; import java.awt.FlowLayout; import javax.swing.*; public class Example extends JApplet { JLabel label; public void init() { System.out.println("init()"); SwingUtilities.invokeLater(new Runnable(){public void run() { label = new JLabel("inited."); getContentPane().setLayout(new FlowLayout()); getContentPane().add(label); }}); } @Override public void start() { System.out.println("start()"); label.setText("started."); } @Override public void stop() { System.out.println("stop()"); label.setText("stopped."); } @Override public void destroy() { System.out.println("destroy()"); label.setText("destroyed."); } }
我对此进行了编译,并修改了HTML文件以使用它,它给出了完全相同的症状。
当用户按下“取消”时,IcedTea似乎已经重新定义了操作。为了公平,在对话框中的按钮是“运行”和“取消”,而不是“运行的所有权限”和“运行沙盒”。
(在Sun的对话框中,有相同的按钮,但实际上它们的含义不是所要求的。)