Запретить обновление времени последнего сеанса в 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

Другие вопросы по тегам