Подтвердить что ты не робот

Как пропустить фильтр в цепочке фильтров в java

У меня есть 2 фильтра в моем приложении. Исходя из некоторого условия, я хочу выбрать, выполнять ли второй фильтр или нет. Есть ли способ сделать это?

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

Любая помощь будет оценена.

4b9b3361

Ответ 1

Вы можете установить атрибут в своем запросе и проверить его во втором фильтре.

public class FirstFilter implements Filter {
    //...

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setAttribute("executeSecondFilter", true);
        //...
        if(someReason)
            servletRequest.setAttribute("executeSecondFilter", false);
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

public class SecondFilter implements Filter {
    //..

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if (servletRequest.getAttribute("executeSecondFilter") == null || !((Boolean) servletRequest.getAttribute("executeSecondFilter"))) {
            filterChain.doFilter(servletRequest, servletResponse);
        }
        //...
    }
}

Вы можете упростить код выше:

public class FirstFilter implements Filter {
    //...

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //...
        if(someReason)
            servletRequest.setAttribute("executeSecondFilter", false);
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

public class SecondFilter implements Filter {
    //..

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if (servletRequest.getAttribute("executeSecondFilter") != null) {
            filterChain.doFilter(servletRequest, servletResponse);
        }
        //...
    }
}

Таким образом, вы просто проверяете наличие атрибута "executeSecondFilter"

Ответ 2

В дополнение к ответу Колина, есть другой способ: просто не называйте FilterChain#doFilter(), но RequestDispatcher#forward().

if (condition) {
    request.getRequestDispatcher(((HttpServletRequest) request).getServletPath()).forward(request, response);
} else {
    chain.doFilter(request, response);
}

Но это пропустит все фильтры от текущего, ожидайте тех, которые прослушиваются на <dispatcher>FORWARD</dispatcher>.