フィルタ処理をスキップするにはどうすればいいですか?

2157 ワード

今日1つの卵の痛みの問題に出会って、servletを要求する時、直接strutsフィルタの中に行って住所が見つからないで、それから資料を調べてやっと解決して、もし応用の中で複数のフィルタが存在するならば、どのように第1のフィルタの処理の時にある条件によって後続のフィルタの処理をスキップしますか?ここでは、この問題を解決するための2つの方法を提供します.
方法1:後続フィルタで前フィルタ処理後に設定した識別に従って手動でスキップする.IDはRequest Attributesに入れることができます.
publicclass FirstFilter implementsFilter {
    //...
 
    publicvoid doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throwsIOException, ServletException {
        servletRequest.setAttribute("executeSecondFilter",true);
        //...
        if(someReason)
            servletRequest.setAttribute("executeSecondFilter",false);
        filterChain.doFilter(servletRequest, servletResponse);
    }
}
 
publicclass SecondFilter implementsFilter {
    //..
 
    publicvoid doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throwsIOException, ServletException {
        if(servletRequest.getAttribute("executeSecondFilter") == null|| !((Boolean) servletRequest.getAttribute("executeSecondFilter"))) {
            filterChain.doFilter(servletRequest, servletResponse);
        }
        //...
    }
}

方式2:フィルタ処理の場合、後続のフィルタチェーン処理を行わず(FilterChain#doFilter())、要求をサーブレットに直接転送する(RequestDispatcher#forward()).
public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpServletRequest = (HttpServletRequest)req;
		//        ,    servlet
		req.getRequestDispatcher(httpServletRequest.getServletPath() 
				+ httpServletRequest.getPathInfo()).forward(req, res);
	}

これにより、後続のすべてのフィルタ処理がスキップする、あるフィルタがまだ処理する必要がある場合、webで処理することができる.xmlでフィルタを構成します.
?
1 < dispatcher >FORWARD</ dispatcher >
詳細は、サーブレット3.0仕様(JSR-315)6.2.5 Filters and the RequestDispatcherを参照してください.
 
参照先:
StackOverflow:How to skip a filter in the filter chain in java
サーブレット3.0仕様