Spring Boot注册拦截器Interceptor

Laughing
2021-06-07 / 1 评论 / 1,147 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年03月17日,已超过306天没有更新,若内容或图片失效,请留言反馈。

Spring MVC提供了AOP风格的拦截器,拥有更加精细的拦截器处理能力。Spring Boot中拦截器的注册更加方便,步骤如下:

  1. spring-boot-starter-web
  2. 创建拦截器,实现HandlerInterceptor
  3. 配置拦截器,定义配置类进行拦截器的配置

增加依赖

<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);
    }
1

评论 (1)

取消
  1. 头像
    23424
    Windows 10 · Google Chrome

    画图

    回复
  2. 头像
    穆伊扎
    iPhone · Safari

    不错,学习了

    回复