2011-04-21 68 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.小程序無法加載,並且可以在Java控制檯中看到ClassNotFoundException
5.刷新頁面 - 服務器重定向到登錄頁面;登錄後,applet再次不加載並拋出異常。

尋找在Apache訪問日誌證明,在步驟4,瀏覽器(或插件)嘗試加載jar文件並得到一個HTTP錯誤。沒關係,因爲會話已經過期。奇怪的事發生在第5點 - 沒有要求罐子!看來瀏覽器或插件會記住失敗的嘗試,甚至不會嘗試加載jar文件。它只會嘗試加載未在服務器上存在的原始.class文件。

我的結論是否正確?我該如何處理這樣的錯誤?是否有可能強制Java插件加載jar文件?

我檢查了Java控制面板中啓用緩存並不能幫助。將codebase_lookup參數設置爲"false"也沒有幫助。它只能防止試圖直接加載"class"文件。

在此先感謝您的任何建議。

+0

你的錯誤看起來像是試圖加載名爲'lucent.fm.parts.BlankPage.class'的類,這是一個非法的類名(它應該是'lucent.fm.parts.BlankPage',我猜想) 。問題是,爲什麼你的瀏覽器/插件試圖加載這個類? – 2011-04-21 11:06:48

+0

這是因爲HTML頁面:;我可以將其更改爲BlankPage而不是BlankPage.class,但它無濟於事。 根據官方文檔,類名應該帶有「.class」後綴:http://download.oracle.com/javase/6/docs/technotes/guides/plugin/developer_guide/using_tags.html – pkalinow 2011-04-21 14:22:42

回答

1

如果你的小應用程序的html不是靜態的(cgi,php等),那麼在註銷之後,你可以試着強制不同的URL指向jar文件(而不是「my.jar」)。罐子?隨機= 1235232" )。

此外,您還可以嘗試用緩存的HTTP標頭玩。

另一個潛在的解決方法將是重新配置Apache要始終服務於罐子 - 甚至當會話被關閉(如果這是可以接受的)。

2

我有一個具有「註銷」按鈕,一個小程序。該按鈕通過調用CGI腳本結束會話,然後通過調用System.exit()來殺死Java VM。

小應用程序調用System.exit(anyNumber)是粗略地等同於客人燒燬他們的主人的房子。小應用程序(甚至可信任的小應用程序)應該從不嘗試結束虛擬機。當共享虛擬機的頁面中的所有小應用程序都已完成其瀏覽器選擇的destroy()方法和隨後的一段時間時,瀏覽器將終止虛擬機。

順便說一句 - 我記得一個版本的Mozilla/FF,其中調用System.exit(int)不只是結束了虛擬機,還崩潰了瀏覽器!

+1

至於我知道,在調用System.exit時關閉瀏覽器是Sun推出「下一代Java插件」之前的正常行爲。 – pkalinow 2011-04-21 14:18:08

+0

@pkalinow:感謝您的進一步信息。嘗試一次後,我決定這是永不再試。我很高興新插件拒絕了這個請求。瀏覽器有一個完美的**'X' **按鈕來關閉它們(或者你的操作系統/瀏覽器上的任何東西),它們不需要applet的幫助。 – 2011-04-21 15:34:18

+0

「x」按鈕的問題在於,它不會關閉當前會話中的所有窗口,也不會刪除會話cookie。我必須履行這兩項要求。 – pkalinow 2011-04-22 13:12:02

相關問題