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
    
  • Java 7そして最後に、これらの Citrix サーバーがの代わりに (具体的には Java 7 update 9)を使用し始めるまで、このような問題はありませんでしJava 6た。Javaのダウングレードはオプションではないようです。

私はここで完全に迷っています。この問題を解決するためのヒントを誰かが教えてくれませんか? 原因は何ですか?これらの問題を回避する方法はありますか?

4

2 に答える 2

1

まず、ダウンロードしたアプリケーションを実行する前に適切に認証してください (SSL 経由でダウンロードするか、デジタル署名を使用して検証することにより、この場合は jar に署名することもできます)。

問題に。これは、アプレット JVM で実行していることが原因である可能性があります。アプレット jvm のライフサイクルは、ブラウザによって決定されます。したがって、引き続きアプレットをランチャーとして使用する場合は、アプレット サブクラスのApplet.destroy(),Applet.stop()メソッドにデバッグ出力を挿入し、それがシャットダウンに関連しているかどうかを確認します。

もう 1 つの解決策は、Java Webstart を使用して起動することです。これは、Web から Java アプリケーションを起動するための最良の方法です。

于 2012-11-16T13:50:41.250 に答える
0

Overriding the security manager: doesn't that mean that you in fact sidestep the whole Java applet security concept? Publishing an applet that disables the security manager, then loads another application sounds like a really bad idea to me, in particular if you don't have about as much security checks in place as Java applets do. If anyone manages to grab this applet, they can probably use it to load exploit code from their own web site, and you might get your certificates revoked.

Around Java 7u7 a major security issue was fixed:

But it wasn't yet completely fixed in 7u7:

And in fact, there is another one not yet fixed:

これらの変更のいずれかが、セキュリティ マネージャーのサイドステッピングに影響する可能性はありますか?

于 2012-11-16T13:41:19.630 に答える