• 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的拦截器的完成方法会倒续执行。
    • 完成方法会在视图渲染完成之后才去执行。
  • 相关阅读:
    关于 arduino 中的 random()和randomSeed()的使用
    异步编程 - 10 Web Servlet的异步非阻塞处理
    java8函数式编程,常用高阶函数处理
    2、配置git环境与项目创建
    重装系统后新建文本文档打不开怎么办
    GoLang HTTP和REST客户端库: resty
    RabbitMQ 心跳
    Flink测试利器之DataGen初探 | 京东云技术团队
    企业上云原来如此简单,华为云带你体验云上风采
    如何通过沉浸式投影技术提升文旅夜游的互动体验?
  • 原文地址:https://blog.csdn.net/djydjy3333/article/details/126659916