• SpringMVC之拦截器


    应用场景:登陆验证

    HandlerExecutionChain是一个执行链,当请求到达DispatchServlet时,DispatchServlet根据请求路径到HandlerMapping查询具体的Handler,从HandlerMapping返回给DispatcherServlet,其中包含了一个具体的Handler对象和Interceptors(拦截器集合)。

    如何自定义拦截器:

    springmvc的拦截器接口(HandlerInterceptor)定义了三个方法:

      1. preHandle调用Handler之前执行,称为前置方法
        返回值:true表示放行,后续业务逻辑继续执行。
        返回值:false表示被拦截,后续业务逻辑不再执行,但之前返回true的拦截器的完成方法会倒叙执行
      1. postHandle调用Handler之后执行,称为后置方法
      1. afterCompletion视图渲染完成之后执行

    拦截器的执行过程

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    MyInterceptor.java

    package com.deng.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyInterceptor implements HandlerInterceptor {
    
        /**
         * 前置方法,在Handler执行方法之前执行
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            System.out.println("preHandle...");
            return true;
        }
    
        /**
         * 后置方法,在Handler执行方法之后执行
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                               ModelAndView modelAndView) throws Exception {
            System.out.println("postHandle...");
        }
    
        /**
         * 完成方法,在视图渲染完成之后执行
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
            System.out.println("afterCompletion...");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    MyInterceptor2.java

    package com.deng.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyInterceptor2 implements HandlerInterceptor {
    
        /**
         * 前置方法,在Handler执行方法之前执行
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            System.out.println("preHandle2...");
            return true;
        }
    
        /**
         * 后置方法,在Handler执行方法之后执行
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                               ModelAndView modelAndView) throws Exception {
            System.out.println("postHandle2...");
        }
    
        /**
         * 完成方法,在视图渲染完成之后执行
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
            System.out.println("afterCompletion2...");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    springmvc.xml

        
        <mvc:interceptors>
            <mvc:interceptor>
                
                <mvc:mapping path="/**"/>
                
                <bean class="com.deng.interceptor.MyInterceptor">bean>
            mvc:interceptor>
    
            <mvc:interceptor>
                
                <mvc:mapping path="/**"/>
                
                <bean class="com.deng.interceptor.MyInterceptor2">bean>
            mvc:interceptor>
    
        mvc:interceptors>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    拦截前

    在这里插入图片描述
    把MyInterceptor2中preHandle方法的返回值改为false,表示拦截器拦截了请求,不放行,直接返回

    在这里插入图片描述

    拦截后

    在这里插入图片描述
    在这里插入图片描述

    结论:

    • 拦截器的前置方法依次执行,后置方法和完成方法倒序执行
    • 当前置方法返回false时,后续的拦截器以及Handler方法不再执行,但它前序的前置方法返回true的拦截器的完成方法会倒续执行。
    • 完成方法会在视图渲染完成之后才去执行。
  • 相关阅读:
    PHP如何实现动态代理IP
    【蓝桥杯真题练习】STEMA科技素养练习题库 答案版012 持续更新中~
    java----内部类(四种内部类详解)
    云原生爱好者周刊:Prometheus 推出 Agent 模式来适应新的使用场景
    记录和分享一下自己自定义的博客园主题样式
    [附源码]java毕业设计基于web的硕士研究生入学考务管理
    手把手教你写一个JSON在线解析的前端网站1
    【算法leetcode】2325. 解密消息(rust和go重拳出击)
    【2022Java学习计划】值得收藏的学习计划
    安装Aptos CLI 并 部署move智能合约
  • 原文地址:https://blog.csdn.net/djydjy3333/article/details/126659916