zoukankan      html  css  js  c++  java
  • 【SpringBoot】如何给Controller/RestController设置一个前置拦截器

    本文例程下载:https://files.cnblogs.com/files/heyang78/redisCache_Interceptor_sample_210922.rar

    本文适用SpringBoot版本:v2.5.4

    有这样一个RestController类如下:

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class JsonCtrl {
        
        @RequestMapping("/sayhello")
        public String sayHello() {
            System.out.println("准备说你好");
            return "hello";
        }
    }

    这个类就是一般的Rest控制器类,直接用控制器类也是可以的,里面没有特殊设置。

    如何给它设置前置拦截器呢,首先我们需要一个实现了HandlerInterceptor接口的拦截器类:

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.HandlerInterceptor;
    
    @Component
    public class Interceptor implements HandlerInterceptor{
        /**
         * 在请求处理之前进行调用(Controller/RestController方法调用之前)
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
            String path = request.getServletPath();
            System.out.println("已拦截 path="+path);
    
            // 执行权限检查、登录验证、缓存处理等
            
            return true;
        }
    }

    然后,我们需要一个实现了WebMvcConfigurer接口的WebConfig类把拦截器加载进来。

    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;
    
    @Configuration
    public class WebConfig implements WebMvcConfigurer{
        @Autowired
        private Interceptor interceptor;
        
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(interceptor);
        }
    }

    注意,registry.addInterceptor()方法可以添加多个拦截器,不限个数。

    然后把启动类跑起来就好了。

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class MyApplication {
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    }

    这个类没什么特别的。

    内嵌的Tomcat运行起来后,我们可以在浏览器里输入http://localhost:8080/sayhello或是其它路径,然后到控制台去看拦截器是否按预期运转了。

    2021-09-22 20:52:42.992  INFO 22764 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms
    已拦截 path=/sayHello
    已拦截 path=/error
    已拦截 path=/sayhello
    准备说你好
    已拦截 path=/21332
    已拦截 path=/error

    正如预期般运转,很好。

    至此,一个RestController类的前置拦截器就搭建好了。

    参考资料:https://www.cnblogs.com/itfeng813/p/13026652.html

    --END--

  • 相关阅读:
    1052. 爱生气的书店老板
    766. 托普利茨矩阵
    643.子数组的最大平均数I
    450. 删除二叉搜索树中的节点
    1489.找到最小生成树里的关键边和伪关键边
    839相似字符串
    1631.最小体力消耗路径
    SnowFlake雪花算法源码分析&灵活改造,常见分布式ID生成解决方案
    【目标检测】三、Faster R-CNN与R-FCN
    【目标检测】二、Fast R-CNN与SVD
  • 原文地址:https://www.cnblogs.com/heyang78/p/15321715.html
Copyright © 2011-2022 走看看