Почему не срабатывает фильтр после удаления сессии в 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 ) не запускается фильтр. Почему?

Нужно, чтобы фильтр сработал после логаута. Что я пробовал сделать (это, естественно, весь написанный код и плюс):

  1. В 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 шт):

Автор решения: Jake

В то время, пока тут "мегаумы" пытаются заминусовать вопрос по надуманным причинам, находится ответ - <dispatcher>FORWARD</dispatcher>: web.xml:

<filter-mapping>
        <filter-name>DefaultLocaleFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

P.S. Минусаторы, пишите в комментарии свои обоснования. Хотя я вас понимаю, стыдно писать, когда нечего ответить...

→ Ссылка