Applet会在某个时候自动关闭

时间:2012-11-16 12:31:25

标签: java nullpointerexception java-7

我的java应用程序发生了非常奇怪的事情。总之,问题是它有时会在30-60秒的工作后自行关闭。

具体情况如下:

  • 应用程序实际上是在applet设置中启动的,applet加载主应用程序jar,将其保存到磁盘,然后通过反射启动实际程序。 applet jar已签名,应用程序jar未签名,因此我必须覆盖安全管理器。代码如下:

    System.setSecurityManager(new SecurityManager() {
       @Override public void checkPermission(Permission p) {}
    });
    URLClassLoader loader = new URLClassLoader(new URL[] {mainJarFile.toURI().toURL()}, this.getClass().getClassLoader());
    Class<?> app = Class.forName("launch.App", true, loader);
    Method start = app.getDeclaredMethod("start", URL.class, URL.class);
    start.invoke(app.newInstance(), codeBase, documentBase);
    
  • 只有当applet通过Citrix连接到终端服务器运行时才会发生崩溃。

  • 事故并非崩溃。在日志文件中,我看到在正常关闭期间启动并完成了关闭挂钩。
  • 如果在启用了java控制台且trace选项的情况下运行applet,我会在关闭之前看到以下消息:

    security: JSS is not configured
    network: Connecting https://javadl-esd-secure.oracle.com/update/baseline.version with proxy=HTTP @ FWR200/192.168.0.246:8080
    
  • 启动关闭挂钩后,应用程序似乎仍在运行,我在日志中看到如下例外:

    2012.11.13 16:20:07.171 | def.pR.run:1639 | class java.lang.NullPointerException : null
        sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source)
        java.security.AccessController.doPrivileged(Native Method)
        sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source)
        sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)        
        ... // so on, the exception seems to happen in completely regular app code
    
  • 最后,在那些Citrix服务器开始使用Java 7(特别是java 7更新9)而不是Java 6之前,没有这样的问题。降级java似乎不是一种选择。

我完全迷失在这里。有人至少可以给我一些关于解决这个问题的建议吗?可能是什么原因?有办法解决这些问题吗?

2 个答案:

答案 0 :(得分:1)

首先,我希望您在运行之前正确验证下载的应用程序(通过SSL下载或通过使用数字签名进行验证,在这种情况下您可以对jar进行签名)。

解决问题。这可能很容易,因为你正在applet JVM中运行。 applet jvm的生命周期由浏览器决定。因此,如果您仍想使用applet作为启动程序,则在applet子类的Applet.destroy()Applet.stop()方法中插入一些调试输出,看看它是否与关闭有关。

另一种解决方案可能是使用Java Webstart启动它。它确实是从网上启动Java应用程序的最佳方式。

答案 1 :(得分:0)

覆盖安全管理器:这是否意味着您实际上回避整个Java applet安全概念?发布一个禁用安全管理器的applet,然后加载另一个应用程序听起来像非常糟糕的主意给我,特别是如果你没有像Java applet那样多的安全检查。如果有人设法抓住这个applet,他们可能会使用它从他们自己的网站加载漏洞利用代码,你可能会撤销你的证书。

围绕Java 7u7,修复了一个主要的安全问题:

但它在7u7尚未完全修复:

事实上,还有另一个尚未解决的问题:

这些更改中的一个可能会影响您的安全管理员端步骤吗?