Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Отслеживание закрытия веб-окна


Автор: IDVsbruck 7.9.2007, 11:12
Есть основная страничка jsp, куда зашел посетитель. У любого посетителя отображаются данные, общие для всех посетителей. Произошла регистрация, вход или прочие действия, которые предоставляет данная страничка.
В определенном месте подразумевается многооконное использование сайта, когда посетитель открывает ряд окошек, в которых производит определенные действия.
Отслеживание открытия таких окошек не представляется сложным. Открытие таких окошек находит отражение в основном окне, вне зависимости, открыл их текущий посетитель или любой другой на своей странице.

Вопрос в том, как отследить закрытие такого окошка ...
Обработка с помощью HttpSessionListener не проходит, так как сессия для основного окна и для таких окошек одинаковая, то есть метод sessionDestroyed() не вызывается.

Интуитивно вижу два варианта: 1. для каждого окошка создавать свою сессию (можно ли?) и тогда можно отловить в слушателе. 2. создать параллельный процесс, куда будут передаваться идентефикаторы окошек и он постоянно будет их опрашивать (например, AJAX из окошка будет периодически связываться и если по истечеии задержки не было "связи" ... и т.д.) и соответственно реагировать на изменения - но как создать такой параллельный процесс?


И еще один вопрос. Если пользователь закрыл основное окно, метод sessionDestroyed() будет вызван через 30 минут (по умолчанию). А я хочу, чтобы реагировал максимально быстро ... Если поставить time-out в web.xml в какое-то небольшое значение, и если пользователь будет просто смотреть на страничку это время, вылетит ли сессия через этот промежуток?

Спасибо.

Автор: y3u 7.9.2007, 14:19
Цитата(IDVsbruck @  7.9.2007,  12:12 Найти цитируемый пост)
 1. для каждого окошка создавать свою сессию (можно ли?) и тогда можно отловить в слушателе. 


нельзя. Точнее можно, если использовать не куки а только SID и пихать его в каждую ссылку. Каждому окну можно выдавать айдишник при обращении к сервлету, который ее выдает. Можно навесить на ивент закрытия окна навесить джаваскрипт, который будет перед закрытием окна на  некий сервлет постить айдишник этого окна, в сервлете можно выполнять необходимые действия на сервере...

Цитата(IDVsbruck @  7.9.2007,  12:12 Найти цитируемый пост)
2. создать параллельный процесс, куда будут передаваться идентефикаторы окошек и он постоянно будет их опрашивать (например, AJAX из окошка будет периодически связываться и если по истечеии задержки не было "связи" ... и т.д.) и соответственно реагировать на изменения - но как создать такой параллельный процесс


бррр smile

Автор: Aoli 7.9.2007, 17:31
Для каждой странички можно создать свою сессию, достаточно написать фильтр.
Но не для каждого окошка браузера!

Как вариант могу предложить такое решение:
В web.xml ставишь тайм-аут сессии, скажем, минуту.
С помощью AJAX посылаешь байт на сервер каждые 50 секунд.
В итоге, и сессия жива, т.к. сервер дергается и закроешь ее достаточно оперативно.

Но нужно помнить, что это лишняя нагрузка на сервер.

Автор: Tony 7.9.2007, 23:39
В окне:
Код

<body onbeforeunload="userGoOutAjax('v349ht89g53h4t8gj5t4u8854')">
       eeeeeeeeeeeeeeeeeeeeeeeeeeee
</body>

Когда окно будет закриваться сработает на 100%.  smile 

Автор: Aoli 8.9.2007, 11:01
Цитата

Событие onbeforeunload возникает в следующих случаях:
       1. Закрытие текущего окна браузера.
       2. Переход к другой странице, набрав её URL в адресной строке или через закладки.
       3. Нажатие кнопки Back, Forward, Refresh или Home.
       4. Нажатие на ссылку, ведущую к новой странице.
       5. Вызов события click у тега a.
       6. Вызов метода document.write.
       7. Вызов метода document.open.
       8. Вызов метода document.close.
       9. Вызов метода window.close.
      10. Вызов метода window.open с указанием в качестве имени нового окна значения _self.
      11. Вызов метода window.navigate или window.NavigateAndFind.
      12. Вызов метода location.replace.
      13. Вызов метода location.reload.
      14. Указание нового значения свойства location.href.
      15. Отправка значений формы через кнопку input type=submit или вызовом метода form.submit.
(С) Google.com

Т.е. 
1. при посте формы на сервер, пользователь будет сперва терять сессию.
2. Его будут просить залогиниться.
3. Он снова будет заполнять форму и переходить к шагу 1.
"Пони бегает по кругу" (С) Не помню кто

Автор: Tony 8.9.2007, 11:10
А по4ему тy не хо4еш' постить 4ерез Ajax? Страница не будет перегружаться.

Автор: IDVsbruck 8.9.2007, 13:20
О! Супер!
Если честно, то я не знал, как отловить в окне событие закрытия окна. Естественно, при перехвате такого сообщения я отправлю через AJAX запрос (который даже и не должен возвращаться, тем более, к моменту возврата окно уже будет закрыто).
Спасибо за дельные советы.

Тогда еще вопрос-консультация:
у меня в основном окне каждые 10 секунд идет опрос сервлета через AJAX, чтобы интерактивно отслеживать вход и выход посетителей. Не сильно ли это накладно для сервера? - Специально для разгрузки я опрашиваю не БД, а переменную-массив, которая создается в момент запуска сервлета (то есть постоянна) и данные едины, то есть переменная не перегружается для каждого посетителя ...
Так вот сам вопрос: правильна ли такая реализация?
Спасибо.

Автор: Tony 8.9.2007, 13:43
Код

О! Супер!
Если честно, то я не знал, как отловить в окне событие закрытия окна

Теперь будешь знать  smile .  
Код

у меня в основном окне каждые 10 секунд идет опрос сервлета через AJAX...

Да правильно. Т.к. onbeforeunload не даёт гарантии при ошибки браузера(завис или 4его нибуьт ещё). Нас4ёт времени: 10 сек или больше. Зависит от того как шустро будут работать усери. Если медленно, то ставь больше время(delay). 4ем меньше тр****шь сервер тем  лутше.  

Автор: y3u 8.9.2007, 13:59
Цитата(IDVsbruck @  8.9.2007,  14:20 Найти цитируемый пост)
Если честно, то я не знал, как отловить в окне событие закрытия окна. 


http://developer.mozilla.org/en/docs/DOM:window.onclose

как обычно, у майкрософта все через анус,
http://msdn2.microsoft.com/en-us/library/ms536907.aspx

Цитата(Aoli @  8.9.2007,  12:01 Найти цитируемый пост)
1. при посте формы на сервер, пользователь будет сперва терять сессию.


ты не путай, хэндлер надо делать не на body.onbeforeunload, а на window.onbeforeunload.
В мсдн просто написаны случаи для всех хендлеров. При посте формы перегружается боди, а окно -  нет.

Цитата(IDVsbruck @  8.9.2007,  14:20 Найти цитируемый пост)
Естественно, при перехвате такого сообщения я отправлю через AJAX запрос (который даже и не должен возвращаться, тем более, к моменту возврата окно уже будет закрыто).


ничего естественного, если запрос не асинхронный и не возвращает данные. Хотя, это будет самый простой вариант.

Автор: IDVsbruck 10.9.2007, 00:29
Всем большое спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)