如何跳过过滤器处理?

今天遇到了一个蛋疼的问题,就是请求servlet的时候,直接跑到struts过滤器里面去且找不到地址,后来经过查询资料终于解决了,假如应用中存在多个过滤器,如何在第一个过滤器处理时根据某些条件跳过后续过滤器处理?这里提供了两种方式来解决这个问题。

方式一:在后续过滤器中根据前面过滤器处理后设置的标识手动跳过。标识可以放在 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);
        }
        //...
    }
}


方式二:过滤器处理时,不进行后续过滤器链处理(FilterChain#doFilter()),而是直接转发请求给 Servlet(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 中配置该过滤器 <filter-mapping>:

?
1
< dispatcher >FORWARD</ dispatcher >

细节可参阅 Servlet 3.0 规范(JSR-315)6.2.5 Filters and the RequestDispatcher

 

参考:

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值