2011-04-21 3 views
3

У меня есть апплет, который имеет кнопку logout". Кнопка завершает сеанс, вызывая скрипт CGI, а затем убивает Java VM, вызывая System.exit(). Проблема заключается в том, когда пользователь пытается войти снова в том же окне браузера - апплет не загружается с 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. Это нормально, потому что сеанс истек. Странная вещь происходит в 5-м пункте - нет запроса на баночки! Кажется, что браузер или плагин запоминает неудачные попытки и даже не пытается загрузить файлы jar. Он только пытается загрузить исходный файл .class, которого нет на сервере.

Является ли мое заключение правильным? Как я могу справиться с такой ошибкой? Можно ли заставить Java-плагин загружать файлы jar?

Я проверил, что включение кэширования в панели управления Java не помогает. Установка параметра codebase_lookup на "false" тоже не помогает. Это предотвращает попытку напрямую загрузить файл "class".

Заранее благодарим за любые предложения.

+0

Ваша ошибка выглядит как что-то, что пыталось загрузить класс с именем 'lucent.fm.parts.BlankPage.class', который является нелегальным именем класса (это должно быть' lucent.fm.parts.BlankPage', я полагаю) , Вопрос в том, почему ваш браузер/плагин пытается загрузить этот класс? –

+0

Это потому, что страница HTML: ; Я могу изменить его на BlankPage вместо BlankPage.class, но это не поможет. Согласно официальной документации, имя класса должно иметь суффикс «.class»: http://download.oracle.com/javase/6/docs/technotes/guides/plugin/developer_guide/using_tags.html – pkalinow

ответ

1

Если ваш html с апплетами не является статичным (cgi, php и т. Д.), То после выхода из системы вы можете попытаться заставить другой URL-адрес указывать на файл jar (т.е. вместо «my.jar» использовать «my. банка? случайная = 1235232").

Кроме того, вы можете попробовать играть с кеш-заголовками HTTP.

Другим потенциальным обходным решением будет перенастройка apache для обслуживания банок всегда - даже когда сессия была закрыта (если это приемлемо).

2

У меня есть апплет с кнопкой «Выход». Кнопка завершает сеанс, вызывая скрипт CGI, а затем убивает Java VM, вызывая System.exit().

Апплет, вызывающий System.exit(anyNumber), грубо эквивалентен гостю, сжигающему дом своего хозяина. Апплеты (даже доверенные апплеты) должны никогда попытаться закончить виртуальную машину. Виртуальная машина будет завершена браузером, когда все апплеты на странице, совместно использующей виртуальную машину, завершили свои методы destroy() и последующий период времени, выбранный браузером.

BTW - Я помню одну версию Mozilla/FF, где вызов System.exit(int) не просто закончил виртуальную машину, но и разбил браузер!

+1

Что касается Я знаю, что закрытие браузера при вызове System.exit было нормальным поведением до того, как Sun представила «плагин Java следующего поколения». – pkalinow

+0

@pkalinow: Спасибо за дополнительную информацию. После того, как я попробовал это, я решил, что никогда не повторять попытку. Я рад, что новый плагин отказывается от запроса. Браузеры имеют совершенно функциональную кнопку ** 'X' **, чтобы закрыть их (или что бы то ни было в вашей ОС/браузере), им не нужна помощь апплета. –

+0

Проблема с кнопкой 'x' заключается в том, что она не закрывает все окна в текущем сеансе и не удаляет файл cookie сеанса. Эти два требования я должен выполнить. – pkalinow

Смежные вопросы