pre过滤器——ServletDetectionFilter

pre过滤器——ServletDetectionFilter

在zuul组件中,zuulServlet中定义了整个请求的流程,请求会依次经过pre过滤器,route过滤器,post过滤器,然后返回响应结果。
在pre过滤器中,ServletDetectionFilter是默认的第一个执行的过滤器。
 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 }
ServletDetectionFilter

本过滤器的作用是判断请求的来源,判断请求是从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有用到。

posted @ 2019-03-31 13:49  龟速前进  阅读(1077)  评论(0编辑  收藏  举报