HttpSession invalidate перенаправляет на страницу входа в систему

#servlets #servlet-filters #session-fixation

#сервлеты #сервлет-фильтры #фиксация сеанса

Вопрос:

Привет, я использую фильтр сервлетов для изменения идентификатора сеанса при каждом запросе, чтобы избежать фиксации сеанса. Моя проблема в том, что когда метод doFilter завершает работу, приложение перенаправляется на страницу входа. Я просто хочу аннулировать и создать новый сеанс без перенаправления. У меня нет другого фильтра.

Вот мой код doFilter:

 HttpSession session= httpServletReq.getSession();
    
if(session!=null){
  User u = session.getAttribute("user");
  session.invalidate();

  HttpSession newSession = httpServletReq.getSession(true);
  newSession.setAttribute("user", u);
}

chain.doFilter(req, resp);
 

Шаблон в фильтре ***.xhtml**

Почему я получаю перенаправление на вход в систему?

Можно ли изменить идентификатор сеанса в фильтре?

Спасибо

Ответ №1:

измените идентификатор сеанса при каждом запросе, чтобы избежать фиксации сеанса

Вы должны сделать именно это, а не аннулировать сеанс. Вы можете использовать HttpServletRequest#changeSessionId() для этого.

 HttpSession session = httpRequest.getSession(false);
    
if (session != null) {
    httpRequest.changeSessionId();
}

chain.doFilter(request, response);
 

Обратите внимание, что HttpServletRequest#getSession() по умолчанию выполняется автоматическое создание сеанса, поэтому он фактически никогда не возвращается null . Вам нужно явно перейти false к HttpServletRequest#getSession(boolean) .

Тем не менее, вам не обязательно выполнять это при каждом запросе, достаточно выполнить это только в тот момент, когда вы входите в систему пользователя.

Ответ №2:

Вам нужен только метод session.invalidate() .

Когда вы вызываете ‘session.invalidate ()`, существующий сеанс будет признан недействительным.

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

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

1. Спасибо за ответ, если я удалю код getSession после аннулирования старого сеанса, как я могу установить свой пользовательский объект в созданный из запроса новый сеанс?

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