• Spring Boot拦截器Interceptor


    Interceptor 作用

    日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算 PV(Page View)等;
    权限检查:如登录检测,进入处理器检测是否登录;
    性能监控:通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。(反向代理,如 Apache 也可以自动记录)
    通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取 Locale、Theme 信息等,只要是多个处理器都需要的即可使用拦截器实现。

    原理

    Spring Interceptor是面向切面编程具体实现。
    当请求发送到 Controller处理之前,它必须经过0或多个Interceptors处理。

    自定义 Interceptor

    Step 1 实现/继承

    • 实现 org.springframework.web.servlet.HandlerInterceptor接口
    • 继承 org.springframework.web.servlet.handler.HandlerInterceptorAdapter类

    Step 2 重写方法

    • preHandler(HttpServletRequest request, HttpServletResponse response, Object handler)
      方法在请求处理之前被调用,若返回false 则中断后续请求操作。
    • postHandler(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
      方法在当前请求处理完成之后,视图返回渲染之前被调用。
    • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex)
      afterCompletion不管请求是否执行成功失败,都会执行(出现异常有可能跳过)

    Step 3 拦截器Interceptor注册

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new XxxxxInterceptor());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    例子

    public class TestInterceptor extends HandlerInterceptorAdapter {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            //代码逻辑
    		return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            //代码逻辑
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            //代码逻辑
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    拦截器注册

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new TestInterceptor());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    KD树邻域搜索原理,一看就懂,不懂请扇我
    macbook桌面文件丢失
    Android 源码 <Activity> 桌面启动一 [5]
    vue组件实现搜索下拉框功能
    KubeSphere 3.3.0 离线安装教程
    如何可视化编写和编排你的 K8s 任务
    angular:html2canvas报错提示Unable to find iframe window
    Docker下安装oracle环境(以oracle_11g环境为例)
    Vue中的.sync修饰符
    du命令:显示文件或者目录的大小
  • 原文地址:https://blog.csdn.net/malu_record/article/details/134025103