如何跳过过滤器处理?
今天遇到了一个蛋疼的问题,就是请求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>:
<dispatcher>FORWARD</dispatcher>
细节可参阅 Servlet 3.0 规范(JSR-315)6.2.5 Filters and the RequestDispatcher
————————————————
版权声明:本文为CSDN博主「tandaly」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tandaly/article/details/8687671

浙公网安备 33010602011771号