4

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

具体情况如下:

  • 应用程序实际上是在小程序设置中启动的,小程序加载主应用程序 jar,将其保存到磁盘,然后通过反射启动实际程序。小程序 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);
    
  • 只有当小程序通过Citrix连接到终端服务器运行时才会发生崩溃。

  • 事实上,崩溃并不是崩溃。在日志文件中,我看到关闭挂钩在正常关闭期间已按应有的方式启动和完成。
  • 如果小程序在 java 控制台可见且trace选项打开的情况下运行,我会在关机前看到以下消息:

    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 update 9)而不是Java 6. 降级java似乎不是一种选择。

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

4

2 回答 2

1

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

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

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

于 2012-11-16T13:50:41.250 回答
0

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

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

但它在 7u7 中还没有完全修复:

事实上,还有一个尚未修复:

也许其中一项更改会影响您的安全管理器侧步?

于 2012-11-16T13:41:19.630 回答