Как пропустить фильтр в цепочке фильтров в Java - PullRequest
23 голосов
/ 17 сентября 2010

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

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

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

Ответы [ 2 ]

57 голосов
/ 17 сентября 2010

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

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

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

10 голосов
/ 17 сентября 2010

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

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"

...