小工具知识网

当前位置: 首页 > 行业知识 > 【Spring Boot】 深入理解Spring Boot拦截器:自定义设计与实现全攻略

行业知识

【Spring Boot】 深入理解Spring Boot拦截器:自定义设计与实现全攻略

2026-11-01 06:06:14 来源:互联网转载

博客主页:从零开始的-CodeNinja之路

⏩ 收录文章:【Spring Boot】 深入理解Spring Boot拦截器:自定义设计与实现全攻略

欢迎大家点赞评论收藏⭐文章

目录

  • SpringBoot统⼀功能处理
    • 一. 什么是拦截器?
    • 二. 拦截器执行流程
    • 三. 拦截器
        • 3.1 定义拦截器
        • 3.2 注册配置拦截器
        • 3.3 拦截路径的配置

          SpringBoot统⼀功能处理

          一. 什么是拦截器?

          • 需要修改每个接口的处理逻辑
          • 需要修改每个接口的返回结果
          • 接口定义修改,前端代码也需要跟着修改
          • 有没有更简单的办法,统⼀拦截所有的请求,并进行Session校验呢,这里我们学习⼀种新的解决办法:拦

            截器

            拦截器是Spring框架提供的核心功能之⼀,主要用来拦截用户的请求,在指定方法前后,根据业务需要执

            行预先设定的代码.也就是说,允许开发⼈员提前预定义⼀些逻辑,在用户的请求响应前后执行.也可以在用户请求前阻止其执行.

            在拦截器当中,开发⼈员可以在应用程序中做⼀些通用性的操作,比如通过拦截器来拦截前端发来的

            请求,判断Session中是否有登录用户的信息.如果有就可以放行,如果没有就进行拦截.

            二. 拦截器执行流程

            正常的调用顺序:

            有了拦截器之后,会在调用Controller之前进行相应的业务处理,执行的流程如下图

            1. 添加拦截器后,执行Controller的方法之前,请求会先被拦截器拦截住.执行 preHandle() 方法,

              这个方法需要返回⼀个布尔类型的值.如果返回true,就表示放行本次操作,继续访问controller中的

              方法.如果返回false,则不会放行(controller中的方法也不会执行).

            2. controller当中的方法执行完毕后,再回过来执行 postHandle() 这个方法以及

              afterCompletion() 方法,执行完毕之后,最终给浏览器响应数据.

            三. 拦截器

            拦截器的基本使用.

            拦截器的使用步骤分为两步:

            1. 定义拦截器
            2. 注册配置拦截器
            3. 拦截器的拦截路径配置
            3.1 定义拦截器

            自定义拦截器:实现HandlerInterceptor接口,并重写其所有方法

            @Slf4j@Componentpublic class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponseresponse, Object handler) throws Exception {log.info("LoginInterceptor 目标方法执行前执行..");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponseresponse, Object handler, ModelAndView modelAndView) throws Exception {log.info("LoginInterceptor 目标方法执行后执行");}@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info("LoginInterceptor 视图渲染完毕后执行,最后执行");}}
            • preHandle()方法:目标方法执行前执行.返回true:继续执行后续操作;返回false:中断后续操作.

            • postHandle()方法:目标方法执行后执行

            • afterCompletion()方法:视图渲染完毕后执行,最后执行(后端开发现在⼏乎不涉及视图,暂不了 解)

              3.2 注册配置拦截器

              注册配置拦截器:实现WebMvcConfigurer接口,并重写addInterceptors方法

              @Configurationpublic class WebConfig implements WebMvcConfigurer {//⾃定义的拦截器对象@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册⾃定义拦截器对象registry.addInterceptor(loginInterceptor).addPathPatterns("/**");//设置拦截器拦截的请求路径( /** 表示拦截所有请求)}}

              启动服务,试试访问任意请求,观察后端日志

              可以看到preHandle方法执行之后就放行了,开始执行目标方法,目标方法执行完成之后执行

              postHandle和afterCompletion方法.

              我们把拦截器中preHandle方法的返回值改为false,再观察运行结果

              可以看到,拦截器拦截了请求,没有进行响应.

              3.3 拦截路径的配置

              拦截路径是指我们定义的这个拦截器,对哪些请求生效.

              我们在注册配置拦截器的时候,通过 addPathPatterns() 方法指定要拦截哪些请求.也可以通过excludePathPatterns() 指定不拦截哪些请求.

              上述代码中,我们配置的是 /** ,表示拦截所有的请求.

              比如用户登录校验,我们希望可以对除了登录之外所有的路径生效

              import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class WebConfig implements WebMvcConfigurer {//⾃定义的拦截器对象@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册⾃定义拦截器对象registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/user/login");//设置拦截器拦截的请求路径(/** 表示拦截所有请求)}}

              在拦截器中除了可以设置 /** 拦截所有资源外,还有⼀些常见拦截路径设置:

              拦截路径含义举例
              /*⼀级路径能匹配/user,/book,/login,不能匹配/user/login
              /**任意级路径能匹配/user,/user/login,/user/reg
              /book/*/book下的⼀级路径能匹配/book/addBook,不能匹配/book/addBook/1,/book
              /book/**/book下的任意级路径能匹配/book,/book/addBook,/book/addBook/2,不能匹配/user/login

上一篇:校园服务器怎么接网线的?

下一篇:揭秘最佳翻译方式,实现完美英语表达!