2010-10-19 1 views
2

У нас есть приложение GWT, которое развернуто на Tomcat. На сервере, мы установили тайм-аут 1 минутуjava/GWT веб-приложение: как получить обратный вызов по тайм-ауту сеанса

httpSession.setMaxInactiveInterval(1*60) 

На стороне клиента, мы установили несколько печенья с таймаутом 1 минуты, а также. Через 1 минуту мы замечаем, что файлы cookie на стороне клиента удалены; Однако JSESSIONID, установленный контейнером сервлетов (jetty/tomcat), все еще присутствует в клиенте.

В течение таймаут сеанса наш пользователь хочет, чтобы мы запустили диалоговое окно предупреждения/сообщения, чтобы предупредить его о том, что сеанс завершен, и пользователь должен снова войти на сервер. Похоже, нам нужен обратный вызов на стороне клиента в тайм-ауте - есть ли API, который мы можем вызывать для установки обратного вызова в тайм-аут сеанса?

На данный момент, если пользователь попадает на сервер с истекшим сеансом, мы сообщаем ему, что сессия истекло; Однако Клиент хочет, чтобы мы предотвращали «потерянные изменения», предупреждая пользователя о том, что сеанс тайм-аута (без потери времени на редактирование каких-либо данных на стороне клиента, а затем отправки на выяснение того, что сеанс имеет время ожидания - потерянные изменения !)

Каковы другие способы решения этой проблемы?

Спасибо,

+0

Я только начинаю с GWT, и этот вопрос меня немного смущает. Вы используете сеанс для хранения информации о пользователе?Не хотите ли вы сделать его без гражданства и передать информацию о пользователе по каждому запросу? Разве не одна из сил GWT, что вы не ограничены идеей «сессии», когда тайм-аут не имеет смысла? – Kieveli

ответ

1

Для передачи данных с сервера, вы можете использовать либо HTML5 Web Sockets или для старых браузеров, некоторые формы Comet.

В качестве альтернативы, вы можете периодически отправлять клиенту GWT сообщения на сервер, чтобы проверить, доступен ли сеанс, но это приведет к множеству ненужных HTTP-запросов и будет менее эффективным.

+0

спасибо. Нет ли других альтернатив для получения обратного вызова по тайм-ауту сеанса? – anjanb

+0

Поддержка веб-разъема по-прежнему довольно удачна или пропущена. Вы можете подражать ему несколькими обходными решениями, но я не думаю, что в этом случае это стоит того. Длительный опрос будет хорошо работать в этой ситуации, просто после того, как сервер окончательно ответит на непогашенный запрос до убийства сеанса. –

+0

Поддержка веб-сокетов в контейнерах сервлетов Java не существует. Мы используем хром, поэтому он доступен в последней версии браузера; – anjanb

-2

Если ваше приложение файл web.xml добавить это часть WebAPP

<session-config> 
    <session-timeout>30</session-timeout> 
</session-config> 

Это серверный тайм-аут сессий в течение нескольких минут

* Edit - так как идея этого кажется, быть потерянным с некоторыми читателями. Если пользователь пытается поразить сервер с истекшим сеансом, они могут быть перенаправлены на страницу входа в систему, как только спросил первоначальный плакат. Нет причин, по которым передняя часть должна отправить обратный вызов на сервер, когда истекает срок действия файла cookie. Если пользователь не отправляет идентификатор сеанса, они переходят на экран входа в систему. Если они отправляют идентификатор сеанса на истекший сервер, отправьте их на страницу входа. Сообщение Всплывающего может быть обработано в передней части

+0

Вопрос не в настройке периода ожидания. –

+0

Прочее «Однако JSESSIONID, установленный контейнером сервлетов (jetty/tomcat), все еще присутствует в клиенте.», «Сеанс завершен, и пользователь должен снова войти на сервер» и «Что такое другие способы решения с ситуацией? ». если пользователь пытается попасть на сервер с истекшим сеансом, они могут быть перенаправлены на страницу входа в систему, как попросил оригинальный плакат. – Sean

+0

Привет, Шон, спасибо. на данный момент, если пользователь нажимает на сервер с истекшим сеансом, мы говорим ему, что сеанс истек; Тем не менее, Клиент хочет, чтобы мы предупредили пользователя о том, что сеанс был отключен, не тратя время на редактирование каких-либо данных на стороне клиента, а затем отправляя информацию о том, что сеанс завершен. – anjanb

3

Мы сделали это наше приложение GWT, где предупреждали пользователи до начала сессии истекает

  • Мы имеем каждый запрос клиента, чтобы пройти через LoggingAsyncHandler (Продолжит каждый асинхронный вызов с этим)
  • В LoggingAysyncHandler мы устанавливаем таймер (класс Timer от GWT), который немного меньше времени сеанса, поэтому, если до этого момента нет активности, мы выставим сообщение клиенту: «Would вам нравится продолжать «если они нажмут ok, мы сбросим таймер и сделаем фиктивный вызов на сервер, который также сбросит время сеанса.

Надеюсь, это поможет!

+0

vishal, спасибо - идея действительно помогает. Постарайтесь реализовать то же самое и вернуться к вам. – anjanb

+0

«У нас есть каждый клиентский запрос, чтобы пройти через LoggingAsyncHandler (мы расширяем каждый асинхронный вызов с помощью этого)» - можете ли вы подробнее остановиться на этом. Разве не интерфейс Async? Можете ли вы поделиться некоторым кодом высокого уровня? Благодарю. – anjanb

+0

@anjanb: Код немного испорчен, но идея состоит в том, чтобы каждый обработчик async расширялся из LoggingAsyncHandler, который дополнительно реализует AsyncCallback. Теперь вы можете использовать общий код для перезапуска таймера в LoggingAsyncHandler. – Vishal