Веб-сокет Jetty 8 и время ожидания сеанса

#session #jetty #websocket

#сеанс #jetty #веб-сокет

Вопрос:

Я новичок в jetty и пытаюсь разработать небольшое приложение, которое использует разные сервлеты. Одним из этих сервлетов является WebSocketServlet. Теперь я пытаюсь создать механизм аутентификации, и моя основная идея — использовать реализацию HttpSession jetty по умолчанию, доступ к которой можно получить с помощью HttpServletRequest.getSession();

Итак, допустим, я хочу создать небольшое приложение для чата (я говорю только о стороне сервера), и допустим, что есть только два сервлета:

  • WebSocketServlet для получения и пересылки сообщений чата другим пользователям, находящимся в той же комнате чата. У этого есть URL-адрес / сервлеты / чат
  • Кроме того, существует второй «обычный» HttpServlet, называемый AvatarServlet. Функциональность этого сервлета довольно проста: этот сервлет обрабатывает события HTTP POST, позволяя текущему пользователю загружать и изменять изображение своего аватара. URL-адрес /servlets/avatar

Таким образом, сервлет avatar должен обрабатывать HTTP POST только в том случае, если пользователь вошел в систему, что для меня означает, что у пользователя есть действительный HttpSession (конечно, тот же HttpSession, что и сервлет чата).

Мой вопрос: допустим, пользователь общается в течение 1 часа через сервлет чата и решает по истечении этого часа изменить изображение своего аватара через сервлет моего аватара. Поскольку я работаю с веб-сокетами, страница никогда не перезагружается, а сервлет чата был вызван только в начале (1 час назад) для установления соединения с веб-сокетами.

Так что, я думаю, даже если пользователь был онлайн и активен все время, срок действия сеанса истечет, когда пользователь попытается использовать сервлет avatar (через 1 час).

Верно ли мое предположение? У кого-нибудь есть опыт работы с этой темой или знает лучшее решение?

Спасибо

Ответ №1:

Вы можете отправлять ajax-запрос каждые x минут, который не содержит ничего, кроме идентификатора сеанса, и, таким образом, в основном «затрагивает» сеанс. Таким образом, пока у пользователя открыто окно чата, сеанс поддерживается активным. Когда окно чата закрывается, время ожидания сеанса истекает.

Комментарии:

1. Часто этот метод называют «сердцебиением» для поддержания жизни, может помочь, если вам нужно найти способ его реализации 🙂

2. Спасибо, это вариант, который я должен рассмотреть. В противном случае я мог бы установить тайм-аут истечения срока действия сеанса на бесконечность. Также WebSocket необходимо время от времени отправлять на сервер сообщение keep alive, в противном случае соединение с Websocket будет закрыто. Но я пока не могу понять, влияет ли это сообщение с веб-сокетом на объект сеанса (обновление / обновление / расширение)…