#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)