上一篇我们对过滤器的定义和实现做了详细的介绍,这篇博文来介绍和过滤器有着异曲同工之妙的拦截器,两者功能实现上十分的相似,但是在一部分内容上还是存在一定的区别。
相对于过滤器,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。二者区别总结如下:
Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。
Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理的方式来执行。
Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。
现在来实现拦截器。
1. 实现特定拦截器(我们这里实现的拦截器和上一篇过滤器实现一样的功能)
//拦截器实现 完成和过滤器一样的功能 需要实现HandlerInterceptor这个接口 public class LogCostInterceptor implements HandlerInterceptor { long start = System.currentTimeMillis() ; //preHandle是请求执行前执行的 @Override public boolean preHandle(HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse , Object o) throws Exception{ start = System.currentTimeMillis() ; return true ; } //postHandler是请求结束执行的,但只有preHandle方法返回true的时候才会执行 @Override public void postHandle(HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse , Object o , ModelAndView modelAndView)throws Exception{ System.out.println("Interceptor cost1 = " + (System.currentTimeMillis()-start)); } //afterCompletion是视图渲染完成后才执行,同样需要preHandle返回true,该方法通常用于清理资源等工作 @Override public void afterCompletion(HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse , Object o , Exception e)throws Exception{ } }
2. 拦截器配置:
@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LogCostInterceptor()).addPathPatterns("/**") ; WebMvcConfigurer.super.addInterceptors(registry); } }
这样以来,拦截器就初步配置完毕,在前端访问某一网页,实现拦截器访问前后时间差计算。
这样一来,拦截器也顺利实现。
至此,结束。