Почему мой FlashMapFilter отображается при ДВУХ запросах, хотя он расширяет OncePerRequestFilter? - PullRequest
0 голосов
/ 04 января 2012
public class FlashMapFilter extends OncePerRequestFilter {

    @Override
    @SuppressWarnings("unchecked")
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        HttpSession session = request.getSession(false);
        if (session != null) {
            Map<String, ?> flash = (Map<String, ?>) session.getAttribute(FlashMap.FLASH_MAP_ATTRIBUTE);
            if (flash != null) {
                for (Map.Entry<String, ?> entry : flash.entrySet()) {
                    Object currentValue = request.getAttribute(entry.getKey());
                    if (currentValue == null) {
                        request.setAttribute(entry.getKey(), entry.getValue());
                    }
                }
                session.removeAttribute(FlashMap.FLASH_MAP_ATTRIBUTE);
            }
        }
        filterChain.doFilter(request, response);
    }
}

Вместо того, чтобы отображать Flash-сообщение один раз для каждого запроса, отображается сообщение в течение двух полных запросов перед исчезновением. Почему это так?

Ответы [ 2 ]

1 голос
/ 05 января 2012

Сначала убедитесь, что вы установили атрибут только в сеансе.

Также убедитесь, что вы не отображаете тот, который был установлен в сеансе, а только тот, который указан в запросе.Как вы делаете это?Используете JSP EL?Затем вы должны явно использовать ${requestScope.flashScopeAttribute}, так как ${flashScopeAttribute} также будет выполнять поиск по sessionScope.

0 голосов
/ 04 января 2012

Один раз за запрос означает, что doFilterInternal() не будет вызываться дважды в одном запросе.Для лучшей поддержки области действия флэш-памяти см. Spring 3.1 Использование атрибутов флэш-памяти .

Что касается вашего кода, вы пытались установить точку останова на session.removeAttribute?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...