• SpringBoot图文教程7—SpringBoot拦截器的使用姿势这都有


    有天上飞的概念,就要有落地的实现

    • 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍

    • 先赞后看,养成习惯

    SpringBoot 图文教程系列文章目录

    1. SpringBoot图文教程1「概念+案例 思维导图」「基础篇上」
    2. SpringBoot图文教程2—日志的使用「logback」「log4j」
    3. SpringBoot图文教程3—「‘初恋’情结」集成Jsp
    4. SpringBoot图文教程4—SpringBoot 实现文件上传下载
    5. SpringBoot图文教程5—SpringBoot 中使用Aop
    6. SpringBoot图文教程6—SpringBoot中过滤器的使用

    本文内容

    前言

    拦截器是Spring中的概念,和过滤器类似,可以对用户请求进行拦截过滤处理。但是相对于过滤器而言,拦截器要的控制更加的细节,拦截器可以在三个地方进行执行。

    • 可以在请求到达Controller控制器之前 通过拦截器执行一段代码
    • 也可以在控制器执行之后,通过拦截器执行一段代码 【此时只是Controller执行完毕 视图还没有开始渲染】
    • 最后在整个请求结束的时候还可以通过拦截器执行一段时间代码

    整个工作过程如下图

    SpringBoot中拦截器的使用

    需求:在项目中创建一个UserController,然后在UserController的前后使用拦截器打印一些信息

    所以首先我们开发一个UserController

    拦截器使用的开发步骤

    1. 创建拦截器类
    2. 注册拦截器 配置拦截规则
    1. 创建拦截器类
    /**
     * @Component 和 @Service 是一个作用 创建对象
     */
    @Component
    public class MyInterceptor1 implements HandlerInterceptor {
        Logger logger = LoggerFactory.getLogger(MyInterceptor1.class);

        /**
         * 在请求到达Controller控制器之前 通过拦截器执行一段代码
         * 如果方法返回true,继续执行后续操作
         * 如果返回false,执行中断请求处理,请求不会发送到Controller
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            logger.info("拦截器1 在控制器执行之前执行");

            return true;
        }

        /**
         * 控制器之后,跳转前
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            logger.info("拦截器1 在控制器执行之后执行");
        }

        /**
         * 跳转之后执行
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            logger.info("拦截器1 最后执行");
        }
    }
    1. 注册拦截器,配置拦截规则
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        @Autowired
        private MyInterceptor1 myInterceptor1;

        /**
         * 注册拦截器
         * @param registry
         */
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            /**
             * addInterceptor 注册拦截器
             * addPathPatterns 配置拦截规则
             */
            registry.addInterceptor(myInterceptor1)
                    .addPathPatterns("/**");
        }
    }

    细节补充

    postHandle方法中ModelAndView参数

    在postHandle方法中有一个参数是ModelAndView。这个对象在SpringMvc中是一个关键对象,可以进行参数传递和路径跳转。

    ModelAndView
    向request作用域存入数据:mav.addObject("作用域数据的name",值);
    设置跳转路径:mav.setViewName("跳转方式:/目标资源url-pattern");
    作用: model作用+跳转路径的作用

    public ModelAndView xxx(ModelAndView mav){
       //1. 向requset作用域存入一个数据
       mav.addObject("name",值);
       //2. 跳转到xxx.jsp
       mav.setViewName("跳转方式:/目标资源url-pattern");
       return mav;
    }

    通过ModelAndView 我们可以在 postHandle方法中 操作作用域的值 和 设置修改跳转路径

    一次性拦截多个路径

    在注册拦截器的时候 配置拦截路径的addPathPatterns参数为可变长参数,就意味着可以接受String的数组,可以配置多个参数。

    addPathPatterns方法的源码如下

    排除拦截路径

    注册多个拦截器

    我们可以实现多个拦截器,并依次将他们注册进去

       public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(myInterceptor1)
                    .addPathPatterns("/**");
            registry.addInterceptor(myInterceptor2)
                    .addPathPatterns("/**");
        }

    关于多个拦截器的执行顺序设置

    1. 在不做任何设置的时候,多个拦截器的执行顺序和注册的顺序有关,先注册的先执行

    2. 也可以通过Order方法来设置 执行的顺序 值越小越先执行

    总结

    以上就是SpringBoot中拦截器的简单使用。

    恭喜你完成了本章的学习,为你鼓掌!如果本文对你有帮助,请帮忙点赞,评论,转发,这对作者很重要,谢谢。

    让我们再次回顾本文的学习目标

    • 掌握SpringBoot中拦截器的使用

    要掌握SpringBoot更多的用法,请持续关注本系列教程。

    下面体贴的我给朋友萌还准备了一些 自测面试题和项目案例,希望你能够成热打铁,将知识夯扎实。

    自测面试题(答案见下期)

    • 拦截器和过滤器有什么区别?

    上期自测面试题答案,见面试题集锦 https://gitee.com/bingqilinpeishenme/Lu-JavaNodes

    自测实现项目小案例(答案见下期)

    本次需求:

    练习文中demo

    上期自测实现项目小案例答案,见码云仓库 https://gitee.com/bingqilinpeishenme/Lu-JavaNodes

    求关注,求点赞,求转发

    欢迎关注本人公众号:鹿老师的Java笔记,将在长期更新Java技术图文教程和视频教程,Java学习经验,Java面试经验以及Java实战开发经验。

  • 相关阅读:
    二叉树的最大深度
    [CSP-S模拟测试]:飘雪圣域(莫队)
    [CSP-S模拟测试]:玩具(概率DP)
    [CSP-S模拟测试]:梦境(贪心+小根堆)
    [CSP-S模拟测试]:小P的生成树(数学+Kruskal)
    [CSP-S模拟测试]:小P的单调数列(树状数组+DP)
    [CSP-S模拟测试]:小P的2048(模拟)
    [CSP-S模拟测试]:简单的操作(二分图+图的直径)
    [CSP-S模拟测试]:简单的期望(DP)
    [CSP-S模拟测试]:简单的序列(DP)
  • 原文地址:https://www.cnblogs.com/bingyang-py/p/12369220.html
Copyright © 2020-2023  润新知