执行顺序
前置Filter---->前置Interceptor---->controller---->后置Interceptor---->后置Filter
实现步骤:
1、创建自己的拦截器类并实现 HandlerInterceptor 接口。
2、
- 创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。(SpringBoot 2.0之前)
- SpringBoot 2.0 后,WebMvcConfigurerAdapter被标记为@Deprecated。官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport,方式一:实现WebMvcConfigurer接口(推荐),方式二:继承WebMvcConfigurationSupport类
3、实例化自定义的拦截器
4、将拦截器对像手动添加到拦截器链中(在addInterceptors方法中添加)
代码
自定义拦截器
实现 HandlerInterceptor 接口
preHandle() 方法:进入controller层之前拦截请求
postHandle() 方法:处理请求完成后视图渲染之前的处理操作 请求之后,控制器中抛出了异常的话就不会执行。
afterCompletion() 方法:视图渲染之后的操作,请求之后调用,不管抛不抛出异常都会被调用.参数中异常如果被异常处理器调用的话就不会传入到参数中。
@Component
//1、创建自己的拦截器类并实现 HandlerInterceptor 接口。
public class MyInterceptor implements HandlerInterceptor {
/**
* 进入controller层之前拦截请求
* */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor preHandle");
return true;
}
/**
* 处理请求完成后视图渲染之前的处理操作
*
* 请求之后,控制器中抛出了异常的话就不会执行
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor postHandle");
}
/**
* 视图渲染之后的操作
*
* 请求之后调用,不管抛不抛出异常都会被调用.参数中异常如果被异常处理器调用的话就不会传入到参数中.
* */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor afterCompletion");
}
}
注册拦截器
spring boot 1.X是继承WebMvcConfigurerAdapter
重写addInterceptors方法,注册拦截器
@Configuration
//2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
public class MyInterceptorConfiguration extends WebMvcConfigurerAdapter {
//3、实例化自定义的拦截器
@Resource
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//如果interceptor中不注入redis或其他项目可以直接new
//4、将拦截器对像手动添加到拦截器链中(在addInterceptors方法中添加)
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
}
}
SpringBoot 2.0后:
方式一:实现WebMvcConfigurer接口(推荐)
@Configuration
//2、创建一个Java类实现WebMvcConfigurer接口,并重写 addInterceptors 方法。
public class MyInterceptorConfiguration implements WebMvcConfigurer {
//3、实例化自定义的拦截器
@Resource
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//如果interceptor中不注入redis或其他项目可以直接new
//4、将拦截器对像手动添加到拦截器链中(在addInterceptors方法中添加)
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
}
}
方式二:继承WebMvcConfigurationSupport类
@Configuration
//2、创建一个Java类继承WebMvcConfigurationSupport,并重写 addInterceptors 方法。
public class MyInterceptorConfiguration extends WebMvcConfigurationSupport {
//3、实例化自定义的拦截器
@Resource
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//如果interceptor中不注入redis或其他项目可以直接new
//4、将拦截器对像手动添加到拦截器链中(在addInterceptors方法中添加)
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
}
}
原文参考:https://blog.csdn.net/jy02268879/article/details/84302520
参考文章:
- Spring Boot拦截器配置:https://cs.xieyonghui.com/java/spring-boot-interceptor-configuration_55.html
- WebMvcConfigurer介绍:https://juejin.cn/post/6844903863640653832
- WebMvcConfigurationSupport与WebMvcConfigurer的关系: https://www.jianshu.com/p/d47a09532de7
- WebMvcConfigurer 与 WebMvcConfigurationSupport的坑:https://www.cnblogs.com/myitnews/p/12329126.html
- Spring Boot配置接口 WebMvcConfigurer:https://blog.csdn.net/fmwind/article/details/81235401
- WebMvcConfigurerAdapter详解:https://blog.csdn.net/weixin_43453386/article/details/83623242#1addInterceptors_32
- HandlerAdapter适配器模式实践源码分析:
https://blog.csdn.net/f641385712/article/details/89844141
补充:
实践出真知
继承WebMvcConfigurationSupport类时,如果加了@EnableWebMvc,拦截器不能正常执行。不加@EnableWebMvc注解,拦截器正常执行
继承WebMvcConfigurerAdapter 与 实现WebMvcConfigurer接口时,无论是否加 @EnableWebMvc注解,都能正常执行
原因可能如下:
https://blog.csdn.net/weixin_42479595/article/details/104562174