pre过滤器——ServletDetectionFilter
pre过滤器——ServletDetectionFilter
在zuul组件中,zuulServlet中定义了整个请求的流程,请求会依次经过pre过滤器,route过滤器,post过滤器,然后返回响应结果。
在pre过滤器中,ServletDetectionFilter是默认的第一个执行的过滤器。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class ServletDetectionFilter extends ZuulFilter { 2 public ServletDetectionFilter() { 3 } 4 5 public String filterType() { 6 return "pre"; 7 } 8 9 public int filterOrder() { 10 return -3; 11 } 12 13 public boolean shouldFilter() { 14 return true; 15 } 16 17 public Object run() { 18 RequestContext ctx = RequestContext.getCurrentContext(); 19 HttpServletRequest request = ctx.getRequest(); 20 if (!(request instanceof HttpServletRequestWrapper) && this.isDispatcherServletRequest(request)) { 21 ctx.set("isDispatcherServletRequest", true); 22 } else { 23 ctx.set("isDispatcherServletRequest", false); 24 } 25 26 return null; 27 } 28 29 private boolean isDispatcherServletRequest(HttpServletRequest request) { 30 return request.getAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null; 31 } 32 }
本过滤器的作用是判断请求的来源,判断请求是从dispatcherServlet来的还是 从zuulServlet来的。
并将判断结果存放到RequestContext中。
/**判断请求是否为从dispatcherServlet进入的*/ private boolean isDispatcherServletRequest(HttpServletRequest request) { /**
*WEB_APPLICATION_CONTEXT_ATTRIBUTE:DispatcherServlet.class.getName()+".CONTEXT"
*类名.class.getName():表示获取全限定类名
*/ return request.getAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null; }
过滤器处理过后会将处理结果以键值对的形式存入RequestContext中。
键为:isDispatcherServletRequest 值为:true或者false。
通过RequestUtils.isDispatcherServletRequest()或者RequestUtils.isZuulServletRequest()判断请求的源头,以实现后续不同的处理机制。
实际应用:在Servlet30WrapperFilter、PreDecorationFilter有用到。