Подтвердить что ты не робот

Java-сервлет - Очистка сеанса (HttpServletRequest)

Общий вопрос о сервлетах Java и лучший способ обработки запросов. Если я удалю мой метод doGet из запроса удаленного сервера:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
  ....
  <do work here>
  ....
  kill(request);
}

private void kill(HttpServletRequest request) {
//How do I kill the user session here?
}

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

Я попытался создать объект HttpSession с использованием объекта запроса, но получил те же результаты:

HttpSession session = request.getSession();
session.invalidate();
4b9b3361

Ответ 1

HttpSession session = request.getSession(false);
if (session != null) {
    session.invalidate();
}

это правильный путь, как указано в документации. Новый сеанс будет создан, как только клиент отправит новый запрос.

Вы упомянули, что ваши сессии все еще занимают память. У вас есть другие ссылки на эти объекты в сеансе?

Вы также можете взглянуть на: поведение сеанса сервлета и Session.invalidate

Ответ 2

вы можете удалить атрибут из сеанса, используя

session.removeAttribute("attribute name");

Ответ 3

Попробуйте

session = request.getSession(false); // so if no session is active no session is created
if (session != null)
  session.setMaxInactiveInterval(1); // so it expires immediatly

Ответ 4

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

Чтобы убедиться, что ваш код не использует сеанс, напишите оболочку запроса, которая переопределит методы getSession().