| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Отслеживание закрытия веб-окна |
| Автор: IDVsbruck 7.9.2007, 11:12 |
| Есть основная страничка jsp, куда зашел посетитель. У любого посетителя отображаются данные, общие для всех посетителей. Произошла регистрация, вход или прочие действия, которые предоставляет данная страничка. В определенном месте подразумевается многооконное использование сайта, когда посетитель открывает ряд окошек, в которых производит определенные действия. Отслеживание открытия таких окошек не представляется сложным. Открытие таких окошек находит отражение в основном окне, вне зависимости, открыл их текущий посетитель или любой другой на своей странице. Вопрос в том, как отследить закрытие такого окошка ... Обработка с помощью HttpSessionListener не проходит, так как сессия для основного окна и для таких окошек одинаковая, то есть метод sessionDestroyed() не вызывается. Интуитивно вижу два варианта: 1. для каждого окошка создавать свою сессию (можно ли?) и тогда можно отловить в слушателе. 2. создать параллельный процесс, куда будут передаваться идентефикаторы окошек и он постоянно будет их опрашивать (например, AJAX из окошка будет периодически связываться и если по истечеии задержки не было "связи" ... и т.д.) и соответственно реагировать на изменения - но как создать такой параллельный процесс? И еще один вопрос. Если пользователь закрыл основное окно, метод sessionDestroyed() будет вызван через 30 минут (по умолчанию). А я хочу, чтобы реагировал максимально быстро ... Если поставить time-out в web.xml в какое-то небольшое значение, и если пользователь будет просто смотреть на страничку это время, вылетит ли сессия через этот промежуток? Спасибо. |
| Автор: Aoli 7.9.2007, 17:31 |
| Для каждой странички можно создать свою сессию, достаточно написать фильтр. Но не для каждого окошка браузера! Как вариант могу предложить такое решение: В web.xml ставишь тайм-аут сессии, скажем, минуту. С помощью AJAX посылаешь байт на сервер каждые 50 секунд. В итоге, и сессия жива, т.к. сервер дергается и закроешь ее достаточно оперативно. Но нужно помнить, что это лишняя нагрузка на сервер. |
| Автор: Tony 7.9.2007, 23:39 | ||
В окне:
Когда окно будет закриваться сработает на 100%. |
| Автор: Aoli 8.9.2007, 11:01 | ||
Т.е. 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 | ||||
Теперь будешь знать
Да правильно. Т.к. onbeforeunload не даёт гарантии при ошибки браузера(завис или 4его нибуьт ещё). Нас4ёт времени: 10 сек или больше. Зависит от того как шустро будут работать усери. Если медленно, то ставь больше время(delay). 4ем меньше тр****шь сервер тем лутше. |
| Автор: y3u 8.9.2007, 13:59 | ||||||
http://developer.mozilla.org/en/docs/DOM:window.onclose как обычно, у майкрософта все через анус, http://msdn2.microsoft.com/en-us/library/ms536907.aspx
ты не путай, хэндлер надо делать не на body.onbeforeunload, а на window.onbeforeunload. В мсдн просто написаны случаи для всех хендлеров. При посте формы перегружается боди, а окно - нет.
ничего естественного, если запрос не асинхронный и не возвращает данные. Хотя, это будет самый простой вариант. |
| Автор: IDVsbruck 10.9.2007, 00:29 |
| Всем большое спасибо. |