什么是 springBoot 拦截器?

问题: 启动项目后, 无法打开 swagger 页面.

这是因为项目中使用了自定义拦截技术.不过此处的拦截器代码是核心包提供的,不是在项目中实现的(关键字在项目中全局搜不到).

当我们需要是否登陆、权限认证、数据校验、预先设置数据以及统计方法的执行效率就可以使用拦截器

Springboot中的拦截技术主要包含两种方式.一个是 HandlerInterceptor,一个是 MethodInterceptor。

HandlerInterceptor用于拦截 controller 即 URL 当外部调用你的地址时执行拦截器逻辑

MethodInterceptor 用于拦截每个方法 不一定是 controller 方法 可以精细到每个方法

spring有个aop切面功能 就是可以指定某些路径的代码绑定 绑定后只要调用这些方法 就会触发拦截器逻辑

HandlerInterceptor 实现

此项目中 DocIntercept extends BaseIntercept implements HandlerInterceptor

preHandle中可以看到业务逻辑: 特定URL直接跳过判断,否则执行docService的check方法.如果异常则重定向到图1的页面.

自定义拦截器写完后需要注册才能生效.

项目中配置类SpringBootConfigurer extends WebMvcConfigurationSupport,addInterceptors中注册了各种拦截器.

因此如果要跳过此图1页面,需要在此处下手.

HandlerInterceptor Demo

extends WebMvcConfigurationSupport 会导致 WebMvcAutoConfiguration失效 进而无法访问所有页面

Demo项目中采用实现WebMvcConfigurer接口的方式

http://192.168.200.39:999/zhaojun/wudiboot.git

两个核心类:

com.wudi.config.SpringBootConfigurer

com.wudi.intercepter.TestIntercepter

WebMvcConfigurationSupport 引申

WebMvcConfigurationSupport 主要方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
configurePathMatch:配置路由请求规则
configureContentNegotiation:内容协商配置
configureAsyncSupport
configureDefaultServletHandling:默认静态资源处理器
addFormatters:注册自定义转化器
addInterceptors:拦截器配置
addResourceHandlers:资源处理
addCorsMappings:CORS配置
addViewControllers:视图跳转控制器
configureViewResolvers:配置视图解析
addArgumentResolvers:添加自定义方法参数处理器
addReturnValueHandlers:添加自定义返回结果处理器
configureMessageConverters:配置消息转换器。重载会覆盖默认注册的HttpMessageConverter
extendMessageConverters:配置消息转换器。仅添加一个自定义的HttpMessageConverter.
configureHandlerExceptionResolvers:配置异常转换器
extendHandlerExceptionResolvers:添加异常转化器
getValidator
getMessageCodesResolver

用的最多的是

1
2
3
4
5
6
7
8
9
/** 解决跨域问题 **/
public void addCorsMappings(CorsRegistry registry) ;

/** 添加拦截器 **/
void addInterceptors(InterceptorRegistry registry);

/** 静态资源处理 **/
void addResourceHandlers(ResourceHandlerRegistry registry);

其中跨域问题处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Configuration
public class AddCorsMappings extends WebMvcConfigurationSupport {
/**
* 跨域访问配置接口
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
.allowCredentials(true)
.allowedHeaders("*")
.maxAge(3600);
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

/**
* 自定义拦截器-基于springmvc
*/
public class CustomInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
return HandlerInterceptor.super.preHandle(request, response, handler);
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}

}

MethodInterceptor 这个项目没用到 下回学到再说