详解java中春天里的三大拦截器

  

<强>过滤器

  

新建TimeFilter         @ component   公共类TimeFilter实现滤波器{   @Override   FilterConfig FilterConfig公共空init()抛出ServletException {   系统。println(“时间过滤init”);   }      @Override   公共空间的doFilter (ServletRequest ServletRequest, ServletResponse ServletResponse, FilterChain FilterChain)抛出IOException, ServletException {   系统。println(“时间滤波器启动”);   长时间的开始时间=System.currentTimeMillis ();      filterChain。doFilter (servletRequest servletResponse);      长endTime=System.currentTimeMillis ();   系统。println(“时间滤波器消费”+ (endTime -开始时间)+“女士”);   系统。println(“时间滤波器端”);   }      @Override   公共空间摧毁(){   系统。println(“时间过滤init”);   }   }      

启动服务器,在浏览器输入:http://localhost: 8080/你好# 63;name=汤姆

  

可以在控制台输出如下结果:

  

时间滤波器开始
  名称:汤姆。
  时间滤波器消耗3女士
  结束时间滤波器

  

可以看到、过滤先执行,再到真正执行HelloController.sayHello()方法。
  通过TimeFilter。doFilter (ServletRequest ServletRequest, ServletResponse ServletResponse, FilterChain FilterChain)方法的参数可以看的出,我们只能得到原始的请求和响应对象,不能得到这个请求被哪个控制器以及哪个方法处理了,使用拦截器就可以获得这些信息。
  

  

<强>拦截

  

新建TimeInterceptor         @ component   公开课TimeInterceptor延伸HandlerInterceptorAdapter {      私人最终NamedThreadLocalstartTimeThreadLocal=new NamedThreadLocal<祝辞(“startTimeThreadLocal”);      @Override   公共布尔preHandle (HttpServletRequest请求,HttpServletResponse响应对象处理程序){抛出异常   系统。println(“时间拦截preHandle”);      HandlerMethod HandlerMethod=(HandlerMethod)处理程序;//获取处理当前请求的处理程序信息   系统。println(“处理程序类:”+ handlerMethod.getBeanType () . getname ());   系统。println(“处理方法:“+ handlerMethod.getMethod () . getname ());      MethodParameter [] methodParameters=handlerMethod.getMethodParameters ();   (MethodParameter MethodParameter: methodParameters) {   字符串parameterName=methodParameter.getParameterName ();//只能获取参数的名称,不能获取到参数的值//system . out。println (“parameterName:“+ parameterName);   }//把当前时间放入threadLocal   startTimeThreadLocal.set (System.currentTimeMillis ());      返回true;   }      @Override   公共空白postHandle (HttpServletRequest请求,HttpServletResponse响应对象处理程序,ModelAndView ModelAndView){抛出异常   系统。println(“时间拦截postHandle”);   }      @Override   公共空间afterCompletion (HttpServletRequest请求,HttpServletResponse响应、对象处理程序异常交货){抛出异常//从threadLocal取出刚才存入的开始时间   长时间的开始时间=startTimeThreadLocal.get ();   长endTime=System.currentTimeMillis ();      系统。println(“时间拦截消费”+ (endTime -开始时间)+“女士”);      系统。println(“时间拦截afterCompletion”);   }   }      

<强>注册TimeInterceptor
  

  

把TimeInterceptor注入春容器

        @ configuration   公开课WebConfig延伸WebMvcConfigurerAdapter {      @ autowired   私人TimeInterceptor TimeInterceptor;      @Override   公共空间addInterceptors (InterceptorRegistry注册表){   registry.addInterceptor (timeInterceptor);   }   }      

启动服务器,在浏览器输入:http://localhost: 8080/你好# 63;name=汤姆
  

  

可以在控制台输出如下结果:

        时间滤波器开始   时间拦截preHandle   处理程序类:com.nextyu.demo.web.controller.HelloController   处理方法:sayHello   名称:汤姆   时间拦截postHandle   拦截器使用40毫秒的时间   时间拦截afterCompletion   时间滤波器使用51女士   结束时间滤波器      

可以看到、过滤先于拦截执行,再到真正执行HelloController.sayHello()方法。通过拦截方法上的处理器参数,我们就可以得到这个请求被哪个控制器以及哪个方法处理了。但是不能直接获取到这个方法上的参数值(在这里就是HelloController。sayHello(字符串名称)方法参数名的值),通过方面就可以获取到。

详解java中春天里的三大拦截器