• SpringBoot中 HandlerInterceptor与HandlerInterceptorAdapter


    SpringBoot中 HandlerInterceptor与HandlerInterceptorAdapter

    • HandlerInterceptor是一个接口

    • HandlerInterceptorAdapter是HandlerInterceptor的抽象实现类

    简介

    SpringWebMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于处理器进行预处理和后处理。

    应用场景
    1、日志记录,可以记录请求信息的日志,以便进行信息监控、信息统计等。
    2、权限检查:如登录检测,进入处理器检测是否登陆,如果没有直接返回到登陆页面。
    3、性能监控:典型的是慢日志。
    4、自定义注解:实现自定义注解的功能。

    HandlerInterceptor

    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 {
        }
    }
    

    HandlerInterceptorAdapter

    HandlerInterceptorAdapter继承该接口可以重写其中一个或多个方法。自由度相对来说更高一些。推荐使用

    public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
        public HandlerInterceptorAdapter() {
        }
    
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            return true;
        }
    
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        }
    
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        }
    
        public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        }
    }
    
    

    执行顺序

    • preHandler最先执行

    • postHandler随后执行,

    • preHandler返回false不会执行

    • afterCompletion最后执行,即使preHandler返回false也会执行。

    拦截器执行顺序是按照Spring配置文件中定义的顺序而定的。

    2、会先按照顺序执行所有拦截器的preHandle方法,一直遇到return false为止,比如第二个preHandle方法是return false,则第三个以及以后所有拦截器都不会执行。若都是return true,则按顺序加载完preHandle方法。

    3、然后执行主方法(自己的controller接口),若中间抛出异常,则跟return false效果一致,不会继续执行postHandle,只会倒序执行afterCompletion方法。

    4、在主方法执行完业务逻辑(页面还未渲染数据)时,按倒序执行postHandle方法。若第三个拦截器的preHandle方法return false,则会执行第二个和第一个的postHandle方法和afterCompletion(postHandle都执行完才会执行这个,也就是页面渲染完数据后,执行after进行清理工作)方法。(postHandle和afterCompletion都是倒序执行)

  • 相关阅读:
    索引脚本实例1
    哈尔滨理工大学2016新生赛A题
    拒绝从入门到放弃_《Openstack 设计与实现》必读目录
    生成四位随机数,用于登录验证码制作。
    Python多线程学习(一、线程的使用)
    为什么在 React 16 版本中 render 阶段放弃了使用递归?
    “TensorFlow 开发者出道计划”全攻略,玩转社区看这里!
    【推荐】开源项目ElasticAmbari助力 ElasticSearch、Kibana、ambari服务高效运维管理
    nginx反向代理配置去除前缀
    LNMP架构部署(附:部署Discuz社区论坛Web应用)
  • 原文地址:https://www.cnblogs.com/cuianbing/p/16339672.html
Copyright © 2020-2023  润新知