Spring MVC提供了AOP风格的拦截器,拥有更加精细的拦截器处理能力。Spring Boot中拦截器的注册更加方便,步骤如下:
- spring-boot-starter-web
- 创建拦截器,实现
HandlerInterceptor
- 配置拦截器,定义配置类进行拦截器的配置
增加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
实现HandlerInterceptor
代码如下:
public class MyInterceptor implements HandlerInterceptor {
private final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
/**
* 方法执行前运行
* 必须返回true,后面的方法才能执行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("我先执行");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("我在controller方法之后执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("我最后执行");
}
}
配置拦截器
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
/**
* 拦截器
*
* @param registry registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
//配置拦截的路由
.addPathPatterns("/interceptor/**")
//配置不拦截的路由
.excludePathPatterns("/demo/**")
//配置顺序
.order(1);
}
}
测试
定义controller
测试我们的拦截器
@RestController
@RequestMapping("interceptor")
public class InterceptorController {
private final Logger logger = LoggerFactory.getLogger(InterceptorController.class);
@GetMapping("/test")
public String testInterceptor(){
logger.info("我是controller方法");
return "success";
}
}
通过调用http://localhost:8080/interceptor/test
查看输出日志。
[line]温馨提示[/line]
- 拦截器按照preHandle→Controller→postHandle→afterHandle的顺序执行。
- 只有preHandle方法返回true时,后面的方法才会执行。
- 当拦截器链内存在多个拦截器时,postHandle在拦截器链内所有拦截器返回成功时才会调用。
- 当拦截器链内存在多个拦截器时,afterHandle在拦截器链内所有拦截器返回true时才会调用。
- 当拦截器链内存在多个拦截器时,如果第一个拦截器的preHandle方法返回false,则后面的方法都不会执行。
- 调用controller方法时,只要配置了拦截的路由,哪怕前端请求404,仍然会调用preHandle、postHandle及afterHandle的方法。
如果我们设置了order,代码如下:
/**
* 拦截器
*
* @param registry registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor2())
//配置拦截的路由
.addPathPatterns("/interceptor/**")
//配置不拦截的路由
.excludePathPatterns("/demo/**")
//配置顺序
.order(200);
registry.addInterceptor(new MyInterceptor1())
//配置拦截的路由
.addPathPatterns("/interceptor/**")
//配置不拦截的路由
.excludePathPatterns("/demo/**")
//配置顺序
.order(300);
}
不错,学习了