web-dev-qa-db-ja.com

java)のフィルターチェーンでフィルターをスキップする方法

アプリケーションに2つのフィルターがあります。ある条件に基づいて、2番目のフィルターを実行するかどうかを選択したいと思います。これを行う方法はありますか?

私はグーグルをしましたが成功しませんでした。 2番目のフィルターを実行せずにリクエストを続行したい。それは可能ですか?

どんな助けでもありがたいです。

リクエストに属性を設定し、2番目のフィルターで確認できます。

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」の存在を確認するだけです。

10
Colin Hebert

Colinの答えに加えて、別の方法があります。 FilterChain#doFilter() を呼び出さずに、 RequestDispatcher#forward() を呼び出します。

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

ただし、これはallフィルターを現在からスキップし、<dispatcher>FORWARD</dispatcher>でリッスンしているフィルターを想定します。

59
BalusC