Запретить обновление времени последнего сеанса в Jetty
Можно ли указать серверу Jetty не обновлять время последнего доступа к сеансу при обращении к определенному сервлету?
Наш вариант использования - это HTML-страница, которая отправляет асинхронные запросы в фоновом режиме каждые 5 минут для обновления своего содержимого. Время ожидания сеанса установлено на 30 минут. К сожалению, проблема с этой конфигурацией состоит в том, что когда пользователь оставляет эту страницу открытой на вкладке браузера, сеанс никогда не истекает, поскольку время доступа к сеансу обновляется при каждом асинхронном запросе.
Ради правильности я должен признать, что я еще ничего не пробовал, потому что я не смог найти никакой помощи для моей проблемы в Интернете. Если то, что я запрашиваю, невозможно, я думаю о сохранении времени доступа в переменной сеанса, которая напрямую контролируется приложением. Это значение нужно будет проверить раньше, чем запрос будет обработан (в doGet
а также doPost
методы сервлетов) и сеанс должен быть признан недействительным вручную. Есть ли лучшее решение?
1 ответ
Сервлет не может различить, генерируется ли запрос каким-либо сценарием или человеком, поскольку оба запроса поступают из одного и того же браузера и, следовательно, отправляют один и тот же JSESSIONID. Таким образом, вы должны пометить эти запросы, чтобы отличить их источник. Вы можете пометить их некоторым заголовком или параметром запроса.
Мне нравится ваша идея хранения времени доступа в переменной сеанса (это будет зависеть от истечения сеанса сервлета) Ваш алгоритм будет в этом случае:
if isUser(request){
session.lastRobotAccess == null
}else{
if (session.lastRobotAccess == null) {
session.lastRobotAccess = current_time
} else {
if(current_time - session.lastRobotAccess > session.timeout){
session.invalidate
}
}
}
Когда запрос поступает в контейнер сервлета, он сначала обрабатывается фильтрами (если вы определили), а затем сервлетом. Фильтры полезны для:
Обычный сценарий для фильтра - это сценарий, в котором вы хотите применить предварительную или постобработку к запросам или ответам для группы сервлетов, а не только для одного сервлета. Если вам нужно изменить запрос или ответ только для одного сервлета, создавать фильтр не нужно - просто делайте то, что требуется, непосредственно в самом сервлете.
Поскольку вы можете достичь сеанса из фильтра, они являются более подходящим местом для вашей логики. Вы не будете загрязнять логику сервлета дополнительной проверкой, и вы можете применить ее к другим сервлетам. Фильтры также являются частью спецификации сервлета, поэтому они будут работать в любом контейнере.
Вы уже знали эти вещи, но я просто положил их на "бумаге":-D