• Spring拦截器HandlerInterceptor和HandlerInterceptorAdapter


    参考

    https://blog.csdn.net/zhibo_lv/article/details/81699360
    https://www.cnblogs.com/jing99/p/11147152.html

    HandlerInterceptor

    • 接口,定义了三个方法
    public interface HandlerInterceptor {
        default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            return true;
        }
    
        default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        }
    
        default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
    postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView ;
    afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);

    • 可以自定义拦截器类,直接实现该接口进行拦截

    HandlerInterceptorAdapter是抽象类,间接实现了HandlerInterceptor接口

    • HandlerInterceptorAdapter—>AsyncHandlerInterceptor—>HandlerInterceptor

    • 可以自定义拦截器类,继承HandlerInterceptorAdapter抽象类进行拦截

    • 适配器模式,不必全部实现HandlerInterceptor的三个方法,只需要根据业务需求,实现特定的方法

    如何使用

    1. 创建一个拦截器类,继承HandlerInterceptorAdapter抽象类
    @Slf4j
    @Component
    public class RequestConextInterceptor extends HandlerInterceptorAdapter {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String ip = request.getParameter("ip");
            return true;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 重写preHandle()方法,通过HttpServletRequest获取参数、URI、Cookie、Session等进行业务处理
    2. 配置拦截器
      新建一个类,实现WebMvcConfigurer接口,重写addInterceptors()方法
      把刚才新建的拦截器实例,添加进拦截器列表里
    @Configuration
    @Slf4j
    public class SpringBootPlusWebMvcConfig implements WebMvcConfigurer {
        @Autowired
        RequestConextInterceptor requestConextInterceptor ;
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(requestConextInterceptor ).addPathPatterns("/**");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行流程

    1. 拦截器是一个列表,按顺序执行拦截器的preHandle()方法

    2. 如果preHandle()方法返回false,不再往下执行

    3. 执行主方法,即controller里的接口

    4. 逆序执行postHandle()方法

    5. view页面渲染

    6. 逆序执行afterCompletion()方法

  • 相关阅读:
    CV—cs231n二刷
    .NET关于 跳过SSL中遇到的问题
    JAVA重写与多态
    匹配博弈双边选择算法
    k8s 存储卷详解与动静部署详解
    如何正确的做增量加工
    设计模式浅析(六) ·命令模式
    【C++】引用做函数返回值时必须要注意
    Java 全栈知识体系
    【Linux】linux中你不得不爱的命令集(上)
  • 原文地址:https://blog.csdn.net/weixin_44792849/article/details/127634169