Почему не срабатывает фильтр после удаления сессии в Java?
На JSP странице с я устанавливаю ResourceBundle (перевод берется из properties файлов) и устанавливаю соответствующую локаль переменной ${locale} с областью видимости в пределах сессии:
<fmt:setBundle basename="locale"/>
<fmt:setLocale value="${locale}" scope="session"/>
Как задается значение переменной value="${locale}"? Она устанавливается в фильтре, который, по идее, должен срабатывать перед сервлетом. А вот и сам фильтр:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession(true);
if(session.isNew()) {
session.setAttribute("locale", "en_US");
LOGGER.info("Default locale page set to '{}'.", "en_US");
}
filterChain.doFilter(request, response);
}
Имеется фильтр, который из запроса (HttpServletRequest) получает сессиию (HttpSession) и при условии того, что сессия новая (проверяется в условии if(session.isNew())), устанавливает в сессии атрибут с ключом locale значение en_US (устанавливает дефолтную локаль для JSP страницы в английскую).
Сам фильтр и маппинг фильтра содержатся в web.xml и выглядит следующим образом:
<!-- Set default locale filter -->
<filter>
<filter-name>DefaultLocaleFilter</filter-name>
<filter-class>by.ct.controller.filter.DefaultLocaleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>DefaultLocaleFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Вроде всё в порядке. Идём дальше. В каталоге webapp содержится index.jsp, которая автоматически подгружается при обращении к localhost. В самой index.jsp стоит перенаправление на другую страницу main.jsp, не доступную "извне", так как она располагается по пути /webapp/WEB-INF/jsp/main.jsp'. index.jsp` выглядит следующим образом:
<%@ taglib prefix="с" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<jsp:forward page="WEB-INF/jsp/main.jsp"/>
</body>
</html>
Так вот, вопрос собственно в чем. Когда я на странице main.jsp делаю выход из аккаунта, идет обращение на сервлет, там определяется, что пришла команда "logout", выполняется данная команда (она делает session.invalidate()) и делает forward на index.jsp (которая делает forward на main.jsp). И в промежутке между выполнением logout и форварде на index.jsp (которая делает forward на main.jsp ) не запускается фильтр. Почему?
Нужно, чтобы фильтр сработал после логаута. Что я пробовал сделать (это, естественно, весь написанный код и плюс):
- В
index.jspя менял способ переадресации наmain.jspтаким образом:
1) <jsp:forward page="WEB-INF/jsp/main.jsp"/>
2) <c:redirect url="сontroller?command=go_to_main_page"/> (через сервлет)
Насколько я понимаю, при использовании второго способа будет обращение к контроллеру, а так как идет обращение к контроллеру, то перед этим запустится фильтр, но он не запускается. Сижу 2 полных дня, сегодня 3, не могу понять, почему не срабатывает фильтр для установки локали.
Ответы (1 шт):
В то время, пока тут "мегаумы" пытаются заминусовать вопрос по надуманным причинам, находится ответ - <dispatcher>FORWARD</dispatcher>:
web.xml:
<filter-mapping>
<filter-name>DefaultLocaleFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
P.S. Минусаторы, пишите в комментарии свои обоснования. Хотя я вас понимаю, стыдно писать, когда нечего ответить...