Spring Boot 中使用拦截器

1. Spring Boot 中使用拦截器

⏰ 关键代码

  • 🌏 实现 HandlerInterceptor接口,重写 preHandle方法实现拦截逻辑
    public class DemoInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
             ...
            return true;
        }
    
  • 🌏 实现 WebMvcConfigurer接口,重写 addInterceptors方法,注册拦截器
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
          ...
        }
    }
    
⏰ Maven依赖

  • 🌏 pom.xml 中使用如下依赖,如下:
       <dependencies>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter</artifactId>
           </dependency>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-test</artifactId>
               <scope>test</scope>
           </dependency>
           <!--web 项目依赖-->
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-web</artifactId>
           </dependency>
       </dependencies>
    
⏰ Controller中定义web接口

  • 🌏 程序中,创建 DemoController 类,定义simpleWebApi接口,模拟web请求。如下:
    @Slf4j
    @RestController
    @Validated
    public class DemoController {
        @GetMapping("simpleWebApi")
        public List<String> aopTestSimpleWebApi(@NotNull Boolean isBoys){
            log.info("方法执行中:aopTestSimpleWebApi");
            ArrayList<String> friends ;
            if(isBoys){
                friends =  CollUtil.newArrayList("Joey", "Chandler", "Rose");
            }else {
                friends =  CollUtil.newArrayList("Monica", "Rachel", "Phoebe");
            }
            return friends;
        }
    }
    
⏰ 实现拦截器

  • 🌏 实现 HandlerInterceptor 接口
    @Slf4j
    public class DemoInterceptor implements HandlerInterceptor {
        /**
         * 在方法实际处理之前执行
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws Exception
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            //HandlerMethod类   提供了对方法参数,方法返回值,方法注释等的便捷访问。
            HandlerMethod handlerMethod = (HandlerMethod)handler;
            log.info("方法执行前执行:preHandle");
            //返回true向下执行,返回false中断请求
            return true;
        }
        /**
         * 在方法处理之后执行
         * @param request
         * @param response
         * @param handler
         * @param modelAndView
         * @throws Exception
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            log.info("方法执行后执行:postHandle");
        }
        /**
         * 请求完整完成之后执行
         * @param request
         * @param response
         * @param handler
         * @param ex
         * @throws Exception
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            log.info("方法执行完成,准备返回数据或者视图的时候执行:afterCompletion");
        }
    }
    

    我们重写了接口中的 preHandle 方法,当此方法返回 true 代表通过拦截器,false 代表被拦截器拒绝,请求终止不会再转发到 controller中。同时可以选择性的重写 postHandle 或者 afterCompletion 方法。

⏰注册拦截器

  • 🌏 实现 WebMvcConfigurer ,重写 addInterceptors 方法
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new DemoInterceptor()).addPathPatterns("/*");
        }
    }
    

    registry.addInterceptor(new DemoInterceptor()).addPathPatterns("/*"); 添加 DemoInterceptor 拦截器,并添加拦截路径 /* 代表拦截所有 web 请求。

⏰ 请求接口,查看打印

  • 🌏 浏览器中访问 http://localhost:8080/simpleWebApi?isBoys=true,查看打印日志
    方法执行前执行:preHandle
    方法执行中:aopTestSimpleWebApi
    方法执行后执行:postHandle
    方法执行完成,准备返回数据或者视图的时候执行:afterCompletion
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值