这个小程序是否适用于冰茶JRE?
我提到了一个小型演示。 在为HTML中嵌入的Applet设置策略和冰茶JRE用户评论该演示。 他们失败了。 他们拒绝了对applet的许可 (因此将其限制在沙盒中)并且应该看到绿色的“这个applet是沙盒子”页面。 相反,小程序完全失败了,他们看到了小程序应该在的“灰色空间”。
我想说它正在尝试实例化一个与众不同的File
对象。 IE Sun / Oracle JRE将允许它没有问题,只在applet尝试创建JFileChooser
时抛出安全exception。 OTOH冰茶JRE不允许创建File
。
因此,此代码应该解决该问题。 它会移动创建/添加JEditorPane
并在new File(..)
调用之前安装第一个“所有其他失败”消息,然后是绿色的“沙盒”页面。
我的问题是。 对于使用Iced Tea JRE的用户,此代码是否“广告化”?
测试它:
- 访问pscode.org/test/docload/applet-latest.html上的applet
- 拒绝经过数字签名的代码。 这对于创建测试applet的正确条件非常重要。
- 观察/报告applet是否加载了绿色的sandbox.html 。 沙箱文档将代表修复错误的“成功”。
同样令人感兴趣的是(可能很少)是可信小程序防御加载演示的主页,它链接到小应用程序页面,小程序中显示的每个HTML文件,以及包含源代码的ZIP存档代码和HTML,以及Ant build.xml,这样你就可以“在家里,孩子们”这样做。
这是新代码。
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", "Testing
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
,在你的情况下是空的):
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.(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. (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的错误报告。
为了certificate这一点,我通过省略applet中的所有关键内容创建了一个真正简单的applet:
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的对话框中有相同的按钮,但实际上它们意味着别的东西而不是问。)
作为参考,我可以在Ubuntu 10.04上使用IcedTea 1.9.7确认@PaŭloEbermann的结果:
$ java -version java版“1.6.0_20” OpenJDK运行时环境(IcedTea6 1.9.7)(6b20-1.9.7-0ubuntu1~10.04.1) OpenJDK客户端虚拟机(build 19.0-b09,混合模式,共享)
appletviewer
显示预期的沙箱和fllowing诊断输出。 Ubuntu上的Firefox仅提供Run
(可信)或Cancel
(无)。
$ appletviewer http://pscode.org/test/docload/applet-latest.html 警告:无法读取AppletViewer属性文件:...使用默认值。 在里面() init():输入'try' init():实例化文件 init():文件实例化,创建文件选择器 java.security.AccessControlException:拒绝访问(java.util.PropertyPermission user.home read) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:393) 在java.security.AccessController.checkPermission(AccessController.java:553) 在java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 在java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1302) 在java.lang.System.getProperty(System.java:669) 在javax.swing.filechooser.FileSystemView.getHomeDirectory(FileSystemView.java:397) 在javax.swing.plaf.metal.MetalFileChooserUI.installComponents(MetalFileChooserUI.java:282) 在javax.swing.plaf.basic.BasicFileChooserUI.installUI(BasicFileChooserUI.java:153) 在javax.swing.plaf.metal.MetalFileChooserUI.installUI(MetalFileChooserUI.java:155) 在javax.swing.JComponent.setUI(JComponent.java:651) 在javax.swing.JFileChooser.updateUI(JFileChooser.java:1781) 在javax.swing.JFileChooser.setup(JFileChooser.java:374) 在javax.swing.JFileChooser。(JFileChooser.java:347) 在javax.swing.JFileChooser。(JFileChooser.java:330) 在org.pscode.eg.docload.DocumentLoader.init(DocumentLoader.java:57) 在sun.applet.AppletPanel.run(AppletPanel.java:436) 在java.lang.Thread.run(Thread.java:636) 开始() 停止() 破坏()
在Mac OS X上,Safari 5.05产生预期的结果; 和appletviewer
产生可比较但不完全相同的输出。
$ java -version java版“1.6.0_24” Java(TM)SE运行时环境(版本1.6.0_24-b07-334-9M3326) Java HotSpot(TM)64位服务器VM(内置19.1-b02-334,混合模式) $ appletviewer http://pscode.org/test/docload/applet-latest.html 在里面() init():输入'try' init():实例化文件 init():文件实例化,创建文件选择器 java.security.AccessControlException:拒绝访问(java.io.FilePermission.read) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374) 在java.security.AccessController.checkPermission(AccessController.java:546) 在java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 在java.lang.SecurityManager.checkRead(SecurityManager.java:871) 在java.io.File.exists(File.java:731) 在javax.swing.JFileChooser.setCurrentDirectory(JFileChooser.java:548) 在javax.swing.JFileChooser。(JFileChooser.java:334) 在javax.swing.JFileChooser。(JFileChooser.java:316) 在org.pscode.eg.docload.DocumentLoader.init(DocumentLoader.java:57) 在sun.applet.AppletPanel.run(AppletPanel.java:424) 在java.lang.Thread.run(Thread.java:680) 开始() 停止() 破坏()