Как лучше всего справиться с тайм-аутом сеанса?

Я имею дело с JSP-веб-приложением и получаю проблемы в момент истечения срока действия сеанса. Как указано в файле web.xml, тайм-аут определяется через 30 минут. Но я хочу поддерживать сеанс в течение времени, когда пользователь просто держит окно открытым. Сначала я подумал о простом AJAX-компоненте, который говорит «привет» серверу каждые 10 минут и, возможно, отправляет простое тестовое заявление в базу данных (например, «Выбрать 1»).

Но две вещи вызывают у меня подозрения по этому поводу:

  1. Если бы я поместил простой setTimeout(sayHi(),600) в бесконечный цикл while-JS, было бы это эффективным и мудрым решением?
  2. Является ли даже концепция этого хорошей идеей?

Все пользователи системы совместно используют общее объединенное соединение BoneCP с базой данных для выполнения коротких запросов из базы данных. Также несколько строк данных извлекаются через Hibernate. Hibernate-часть является наиболее подверженной ошибкам частью всего приложения, после тайм-аута эти наборы также необходимо перезагружать. Есть ли способ сохранить Hibernate-Session?

Спасибо за помощь!


person Qohelet    schedule 02.08.2013    source источник
comment
То, что вы делаете, на мой взгляд, контрпродуктивно: с одной стороны, вы хотите ограничить время, которое пользователь должен изучать на сайте, занимаясь тем, чем он хочет, а с другой стороны, искусственно увеличить этот лимит. Почему бы просто не увеличить время ожидания до 2 часов, и все готово?   -  person Thomas Junk    schedule 02.08.2013
comment
1) Если это контрпродуктивно, пожалуйста, дайте мне лучший совет, это то, о чем я просил. 2) Это решение бесполезно, если кто-то отсутствует на 2 часа и 1 минуту 3) Решение, предоставленное Рэем Уодкинсом, имеет отличный побочный эффект, позволяющий работать над правильным управлением сеансом, если пользователи не вышли из системы.   -  person Qohelet    schedule 05.08.2013
comment
Вы должны спросить себя: зачем мне вообще нужен тайм-аут. Буквально ваш тайм-аут - это не тайм-аут, когда нет точки, где время действительно истекло.   -  person Thomas Junk    schedule 06.08.2013


Ответы (1)


Я могу говорить только о тайм-ауте. Бесконечный цикл while-JS не будет работать, потому что javascript в браузере работает в одном потоке, цикл блокирует все остальные действия, фактически замораживая вашу страницу.

метод setInterval объекта window будет выполнять действие (полу) регулярно с заданным вами интервалом

setInterval(sayHi, 600000)

приведет к тому, что sayHi запустится как можно скорее через 10 минут (600000 миллисекунд). Но другие операции будут разрешены в то же время.

(также обратите внимание, что я удалил круглые скобки из вашего sayHi. sayHi() будет разрешено немедленно, а это не то, что вам нужно.)

person Ray Wadkins    schedule 02.08.2013
comment
Звучит здорово, пока что это та функция, которую я искал. Из-за того, что JS не может обрабатывать потоки, тайм-аут все испортит. Спасибо! Знаете ли вы, что может быть необходимо, чтобы сохранить жизнь Hibernate? - person Qohelet; 02.08.2013
comment
Также есть способ использовать setTimeout. Но это уровень более сложный в ненужной манере, поэтому я не упомянул об этом. К сожалению, я не Java-разработчик, поэтому ничем не могу вам помочь на стороне сервера. - person Ray Wadkins; 02.08.2013