2011-04-21 24 views
3

私はlogout"ボタンを持つアプレットを持っています。ボタンはCGIスクリプトを呼び出してセッションを終了し、System.exit()を呼び出してJava VMを終了します。ユーザーが同じブラウザウィンドウで再度ログインしようとすると問題がある - アプレットはClassNotFoundExceptionでロードに失敗:JavaアプレットがInternet Explorerで再読み込みに失敗する

load: class lucent/fm/parts/BlankPage.class not found. 
java.lang.ClassNotFoundException: lucent.fm.parts.BlankPage.class 
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source) 
at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source) 
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 
Caused by: java.io.IOException: open HTTP connection failed:http://example.com/html/lucent/fm/parts/BlankPage/class.class 
at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source) 
at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source) 
at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
... 7 more 
Exception: java.lang.ClassNotFoundException: lucent.fm.parts.BlankPage.class 

それは、Internet Explorerだけでなく、Firefoxで表示されます。 Javaのプラグインは次のとおりです。
Java Plug-in 1.6.0_20
Using JRE version 1.6.0_20-b02 Java HotSpot(TM) Client VM

直接シナリオは以下のです:
1.システムにログイン(アプレットをロードします)。
2.ログアウトします(アプレットは終了しますが、ブラウザウィンドウは存続します)。
3.アドレスバーをクリックし、Enterキーを押します。
4.アプレットが読み込まれず、ClassNotFoundExceptionがJavaコンソールに表示されます。
5.ページを更新する - サーバーはログインページにリダイレクトされます。ログイン後、アプレットは再びロードされず、例外がスローされます。

Apacheアクセスログを見ると、手順4でブラウザ(またはプラグイン)がjarファイルをロードしようとしたときにHTTPエラーが発生することが証明されました。セッションが切れているのでOKです。奇妙なことは5番目の点で起こります - 瓶のための要求はありません!ブラウザやプラグインは失敗した試行を記憶していて、jarファイルを読み込もうとしません。サーバー上に存在しないraw .classファイルのみをロードしようとします。

私の結論は正しいですか?このようなエラーにはどうすれば対処できますか? Javaプラグインにjarファイルをロードさせることは可能ですか?

Javaコントロールパネルでキャッシュを有効にしても有効にならないことが確認されました。 codebase_lookupパラメータを"false"に設定することは役に立ちません。 "class"ファイルを直接ロードしようとしないようにするだけです。

ご意見ありがとうございます。

+0

あなたのエラーは、 'lucent.fm.parts.BlankPage.class'という名前のクラスをロードしようとしたようです。これは不正なクラス名です(' lucent.fm.parts.BlankPage'である必要があります) 。問題は、あなたのブラウザ/プラグインがこのクラスをロードしようとするのはなぜですか? –

+0

これは、HTMLページのためです:; BlankPage.classの代わりにBlankPageに変更することはできますが、それは役に立ちません。 公式の文書によると、クラス名は接尾辞 ".class"である必要があります。http://download.oracle.com/javase/6/docs/technotes/guides/plugin/developer_guide/using_tags.html – pkalinow

答えて

1

htmlが静的(cgi、phpなど)でない場合は、ログアウト後、jarファイルを指す別のURLを強制的に試行できます(「my.jar」ではなく「my」を使用します)。 jar?random = 1235232 ")。

また、キャッシュHTTPヘッダーを使用して再生することもできます。

もう一つの潜在的な回避策は、セッションが閉じられていても(それが受け入れられる場合でも)、jarsを常に提供するようにApacheを再構成することです。

2

「ログアウト」ボタンがあるアプレットがあります。このボタンはCGIスクリプトを呼び出してセッションを終了し、System.exit()を呼び出してJava VMを強制終了します。

System.exit(anyNumber)を呼び出すアプレットは、ホストの家を焼き払うゲストと非常に似ています。アプレット(信頼できるアプレットでさえ)はではありません。 VMを終了しようとします。 VMを共有するページ内のすべてのアプレットがdestroy()メソッドを終了し、ブラウザによって選択された期間が経過すると、そのVMはブラウザによって終了されます。

私はMozilla/FFの1つのバージョンを呼び出すが、System.exit(int)はVMを終了させただけでなく、ブラウザをクラッシュさせたということを思い出しました!

+1

私は、System.exitが呼び出されたときにブラウザを閉じることは、Sunが「次世代Javaプラグイン」を導入する前の通常の動作であることを知っています。 – pkalinow

+0

@pkalinow:詳細情報をありがとう。一度それを試した後、私はそれが決して再度試みることではないと決めました。新しいプラグインがリクエストを拒否してうれしいです。ブラウザは完全に機能する** 'X' **ボタンを(またはあなたのOS /ブラウザ上にあるものを)閉じるために、彼らはアプレットの助けを必要としません。 –

+0

'x'ボタンの問題は、現在のセッションのすべてのウィンドウを閉じず、セッションクッキーを削除しないことです。私はこれらの2つの要件を満たす必要があります。 – pkalinow