<强>过滤器强>
新建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(字符串名称)方法参数名的值),通过方面就可以获取到。