Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отслеживание закрытия веб-окна, когда их несколько на одной сессии 
V
    Опции темы
IDVsbruck
Дата 7.9.2007, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: нет
Всего: 22



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

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

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


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

Спасибо.
PM MAIL   Вверх
y3u
Дата 7.9.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 7
Всего: 13



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


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

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


бррр smile


Это сообщение отредактировал(а) y3u - 7.9.2007, 14:22


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
Aoli
Дата 7.9.2007, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 24.1.2007

Репутация: -1
Всего: 0



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

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

Но нужно помнить, что это лишняя нагрузка на сервер.
PM WWW ICQ   Вверх
Tony
Дата 7.9.2007, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

Репутация: 6
Всего: 12



В окне:
Код

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

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


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
Aoli
Дата 8.9.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 24.1.2007

Репутация: -1
Всего: 0



Цитата

Событие 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.
"Пони бегает по кругу" (С) Не помню кто
PM WWW ICQ   Вверх
Tony
Дата 8.9.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

Репутация: 6
Всего: 12



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


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
IDVsbruck
Дата 8.9.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: нет
Всего: 22



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

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

Репутация: 6
Всего: 12



Код

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

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

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

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


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
y3u
Дата 8.9.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 7
Всего: 13



Цитата(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 запрос (который даже и не должен возвращаться, тем более, к моменту возврата окно уже будет закрыто).


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


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
IDVsbruck
Дата 10.9.2007, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: нет
Всего: 22



Всем большое спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1226 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.