Spring Boot实战:拦截器

上一篇我们对过滤器的定义和实现做了详细的介绍,这篇博文来介绍和过滤器有着异曲同工之妙的拦截器,两者功能实现上十分的相似,但是在一部分内容上还是存在一定的区别。

相对于过滤器,但是提供更精细的的控制能力:在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);
    }
}

这样以来,拦截器就初步配置完毕,在前端访问某一网页,实现拦截器访问前后时间差计算。

Spring Boot实战:拦截器

 

 Spring Boot实战:拦截器

 

 这样一来,拦截器也顺利实现。

至此,结束。

上一篇:Excel 每隔N行N列取N行N列


下一篇:preHandle、postHandle与afterCompletion的区别