springboot2.x | 拦截器(Interceptor)的使用

简介

拦截器是spring中的概念和过滤器类似,都可以处理请求和相应。但对过滤器而言,它更处理对更细致些,可以从三个方向进行拦截处理。

  • perHandle 在控制器访问之前执行代码,作用:通用代码执行,有权放行,终端请求。
  • postHandle 在控制器访问之后,跳转完成之前,执行对代码。作用:修改跳转路径。
  • afterCompletion 在控制器完成跳转之后,跳转到jsp之后,作用:没有什么作用,释放资源对事

创建

1.创建MyInterceptor1 拦截器

//@Component 和 @Service 作用一样:创建对象
@Component
@Slf4j
public class MyInterceptor1 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("拦截器1 在控制器前执行");

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {

        log.info("拦截器1 在控制器后执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {

        log.info("拦截器1 最后执行");
    }

}

2.创建MyInterceptor2 拦截器

@Component
@Slf4j
public class MyInterceptor2 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception  {
        log.info("拦截器2 在控制器前执行");

        //int a = 1/0;

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {

        log.info("拦截器2 在控制器后执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {

        log.info("拦截器2 最后执行");
    }
}

在postHandle方法中有一个参数是ModelAndView。这个对象在SpringMvc中是一个关键对象,可以进行参数传递和路径跳转通过ModelAndView 我们可以在 postHandle方法中 操作作用域的值 和 设置修改跳转路

3.加入配置

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor1 myInterceptor1;

    @Autowired
    private MyInterceptor2 myInterceptor2;
    
    /**
     * 注册拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(myInterceptor2)
                .addPathPatterns("/hello")
                .order(1);

        registry.addInterceptor(myInterceptor1)
                .addPathPatterns("/hello","/interceptor-test")
                .excludePathPatterns("/test")
                .order(5);
        
    }

}

  • 1.在注册拦截器的时候 配置拦截路径的addPathPatterns参数为可变长参数,就意味着可以接受String的数组,可以配置多个参数
  • 2.在不做任何设置的时候,多个拦截器的执行顺序和注册的顺序有关,先注册的先执行也可以通过Order方法来设置 执行的顺序 值越小越先执行
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容