SpringBoot拦截器实现类和配置,以及配置后MVC自动配置不生效问题详解

前言:
  用SpringBoot做微服务,必不可少的要处理各种认证、XSS、加解密问题,需要用到过滤器、拦截器、AOP,这里记录如何优雅的使用拦截器做请求拦截预处理。

1 实现类

  实现HandlerInterceptor接口。
  继承实现HandlerInterceptor接口的实现类,例如:HandlerInterceptorAdapter。
  实现AsyncHandlerInterceptor接口。
这里只展示实现HandlerInterceptor接口和AsyncHandlerInterceptor介绍。

1.1 HandlerInterceptor接口介绍

在这里插入图片描述

  实现HandlerInterceptor接口提供了三个方法,选择需要的将他们实现。
  (1)preHandle:业务处理请求前被调用,若返回值为true则拦截放过,若返回值false请求被中止。
  (2)postHandle:Controller请求后返回视图前处理。
  (3)afterCompletion:Controller请求返回后处理。

1.2 AsyncHandlerInterceptor接口介绍

在这里插入图片描述
  AsyncHandlerInterceptor接口比HandlerInterceptor增加了一个方法afterConcurrentHandlingStarted,该接口方法是在使用了异步的方法时调用,例如:controller请求内调用了含@Async的方法,会触发afterConcurrentHandlingStarted方法执行,触发前还是先执行preHandle。

2 配置

  将拦截器加入到MVC中有三种方式,都是在扩展类中重写父类方法如下:
  (1) @EnableWebMvc + implements WebMvcConfigurer
  注意:这种方式会屏蔽掉SpringBoot对SpringMVC的自动配置!
  (2)@Configuration + implements WebMvcConfigurer
  这种方式最安全,不会屏蔽掉SpringBoot对SpringMVC的自动配置,推荐使用。
  (3)@Configuration + extends WebMvcConfigurationSupport
  注意:这种方式会屏蔽掉SpringBoot对SpringMVC的自动配置!

2.1 详解MVC自动配置生效问题

  踩坑原因:swagger2访问失效404
  上述方法(1)(2)导致自动配置生效,首先我们看一下自动配置类WebMvcAutoConfiguration的源码定义:
在这里插入图片描述

SpringBoot自动配置类WebMvcAutoConfiguration上有条件注解
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
  这个注解的意思是,在项目类中,缺少WebMvcConfigurationSupport类型的bean时,改用自动配置,如果具有该类型bean,自动配置生效,需要在该类型bean中自己重写需要的配置。
  如果不愿意重写配置,可以使用(2)@Configuration + implements WebMvcConfigurer方式配置。

2.2 @Configuration + implements WebMvcConfigurer方式配置

@Configuration
public class WebRequestConfig implements WebMvcConfigurer {
   /**
	* 实现类
	*/
    @Autowired
    private AppMarkIdInterceptor appMarkIdInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 自定义拦截器,指定拦截路径和排除拦截路径
        registry.addInterceptor(appMarkIdInterceptor).addPathPatterns("/**");
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章