当前位置: 首页 > article >正文

【SpringBoot】深度解析 Spring Boot 拦截器:实现统一功能处理的关键路径

前言

🌟🌟本期讲解关于拦截器的详细介绍~~~

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

🔥 你的点赞就是小编不断更新的最大动力                                       

🎆那么废话不多说直接开整吧~~

 

目录

📚️1.拦截器

🚀1.1拦截器快速入门

1.⾃定义拦截器

2.配置拦截器

🚀1.2拦截器的详解

1.拦截路径

2.拦截器执行流程

🚀1.3登录校验

1.定义拦截器

2.配置拦截器

📚️2.总结

 

 

📚️1.拦截器

 强制登录的功能, 后端程序根据Session来判断⽤⼾是否登录, 但是实现⽅法是⽐较⿇烦的

• 需要修改每个接⼝的处理逻辑
• 需要修改每个接⼝的返回结果
• 接⼝定义修改, 前端代码也需要跟着修改

即我们不需要一个一个请求的后端代码进行修改,直接在每个请求之前,进行拦截判断这里的界面是否是用户进行了登录;

🚀1.1拦截器快速入门

什么是拦截器:

拦截器是Spring框架提供的核⼼功能之⼀, 主要⽤来拦截⽤⼾的请求, 在指定⽅法前后, 根据业务需要执⾏预先设定的代码.

也就是说, 允许开发⼈员提前预定义⼀些逻辑, 在⽤⼾的请求响应前后执⾏. 也可以在⽤⼾请求前阻⽌其执⾏.

在拦截器当中,开发⼈员可以在应⽤程序中做⼀些通⽤性的操作, ⽐如通过拦截器来拦截前端发来的请求, 判断Session中是否有登录⽤⼾的信息. 如果有就可以放⾏, 如果没有就进⾏拦截

大致的流程图如下:

 

拦截器的大致使用就是一下两步:

1.定义拦截器

2.配置拦截器 

大概的意思就是:

首先一个学校的大门的保安,首先要招聘,在招聘到保安人员后,然后再安排这个保安去哪里进行看守,那么招聘就是定义拦截去,安排哪里进行看守就是配置拦截器;

1.⾃定义拦截器

自定义拦截器,就是实现HandlerInterceptor接⼝,并重写其所有⽅法,那么具体的代码就是如下所示的:

 @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

       log.info("LoginInterceptor ⽬标⽅法执⾏前执⾏..");
       return true
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
         log.info("LoginInterceptor ⽬标⽅法执⾏后执⾏..");
       
    }

解释:

• preHandle()⽅法:⽬标⽅法执⾏前执⾏. 返回true: 继续执⾏后续操作; 返回false: 中断后续操作.
• postHandle()⽅法:⽬标⽅法执⾏后执⾏
• afterCompletion()⽅法:视图渲染完毕后执⾏,最后执⾏(后端开发现在⼏乎不涉及视图, 暂不了
解) 

这里小编没有重写这里的afterCompletion()方法~~

这段代码就是说明了这两个拦截器一个在请求执行前进行,一个请求后再次执行;设置为true就表示要执行)(不拦截进行放行),反之就是不执行;

2.配置拦截器

我们在定义好拦截器后,那么此时就应该进行安排这个拦截器在哪里工作了,此时就涉及拦截器的配置,实现WebMvcConfigurer接⼝,并重写addInterceptors⽅法,具体的代码如下所示:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    //注入拦截器
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**");
    }
}

解释:

这里的大致意思就是安排拦截器到所有请求之前,(“/**”)代表的路劲就是所有的请求,然后再通过Autowired引进这里的拦截器对象,致此我们就完成了只有打印工作的拦截器,此时运行后控制面板的日志的打印如下所示:

注意:

请求请求,肯定是要进行请求后才会出现这里的日志信息,别忘了在日志观察前,进行请求的发送;

🚀1.2拦截器的详解

拦截器的⼊⻔程序完成之后,接下来我们来介绍拦截器的使⽤细节。拦截器的使⽤细节我们主要介绍拦截器的拦截路径配置

1.拦截路径

拦截路径是指我们定义的这个拦截器, 对哪些请求⽣效.我们在注册配置拦截器的时候, 通过 addPathPatterns() ⽅法指定要拦截哪些请求. 也可以通过excludePathPatterns() 指定不拦截哪些请求.
⽐如⽤⼾登录校验, 我们希望可以对除了登录之外所有的路径⽣效

代码如下所示:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    //注入拦截器
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login")             
        ;
    }
}

解释:

addPathPatterns:这里就是指定要拦截的请求;

.excludePathPatterns:这里就是指定不必进行拦截的请求,我们要进进行登录,那么这里肯定是不可以进行拦截的;

常见的路径的拦截:

注意:在书写这里的路径的时候,这里的/book/**,第一个这里的正斜杠是不一可以进行省略的,不要问为啥,因为这里小编所犯的错误;

2.拦截器执行流程

正常的情况下,我们的执行流程就是如下所示:

有了拦截器之后,会在调⽤ Controller 之前进⾏相应的业务处理,执⾏的流程如下图:

 

解释:

1.添加拦截器后, 执⾏Controller的⽅法之前, 请求会先被拦截器拦截住. 执⾏ preHandle() ⽅法,
这个⽅法需要返回⼀个布尔类型的值. 如果返回true, 就表⽰放⾏本次操作, 继续访问controller中的
⽅法. 如果返回false,则不会放⾏(controller中的⽅法也不会执⾏).

2. controller当中的⽅法执⾏完毕后,再回过来执⾏ postHandle() 这个⽅法以及afterCompletion() ⽅法,执⾏完毕之后,最终给浏览器响应数据 

🚀1.3登录校验

1.定义拦截器

从session中获取⽤⼾信息, 如果session中不存在, 则返回false,并设置http状态码为401, 否则返回true.

代码如下所示:

public class LoginInterceptor implements HandlerInterceptor {
    //定义拦截器,重写方法
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        HttpSession session = request.getSession();
        UserInfo userInfo = (UserInfo) session.getAttribute(constant.USER_SESSION_KEY);
        if (userInfo==null || userInfo.getId()<=0){
            //用户未登录
            response.setStatus(401);
            return false;
        }
        return true;
    }
}

解释:

我们这里拿到session后,进行判断,通过这里的key拿到对应的值,通过对象来接收后,判断这里的对象是否为空,或者这里的id的值是否小于0,若满足条件那么设置状态码401,然后进行拦截;

2.配置拦截器
  @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/css/**")
                .excludePathPatterns("/js/**")
                .excludePathPatterns("/pic/**")
                .excludePathPatterns("/**/*.html")
        ;
    }

解释:

这里设置所有的后端请求,都包括这里的拦截器,但是我们的目的就是跳转至登录页面,所以这里的请求不必拦截,以及静态的前端请求不必拦截

最后在前端的代码添加如下所示:

               error: function (error) {
                    if (error != null && error.status == 401) {
                        location.href = "login.html";
                    }
                }

解释:

当接收到401状态码后,重新定义error方法,直接进行页面的跳转,就完成了页面强制登录的操作了;这里我们响应中设置了状态码,所以这里直接取到状态码;

📚️2.总结

本期小编主要总结了在SpringBoot中统一功能处理的拦截器功能,从简单了解实现方法,定义到配置到如何运用到我们的图书管理系统代码里都做了解释~~

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

       😊😊  期待你的关注~~~


http://www.kler.cn/a/460520.html

相关文章:

  • 算法解析-经典150(双指针、滑动窗口)
  • 跳转至系统设置下某个子模块 - 鸿蒙 Harmony
  • 前端异常处理合集
  • Java-多种方法实现多线程计数
  • 【Triton-ONNX】如何使用 ONNX 模型服务与 Triton 通信执行推理任务上-Triton快速开始
  • HTML5 进度条(Progress Bar)详解
  • debian安装Nginx
  • [羊城杯 2024]不一样的数据库_2
  • QGIS移动图元功能
  • 纯血鸿蒙ArkUI相对布局详解
  • 简易内存池(中)
  • Kubernetes: NetworkPolicy 的实践应用
  • 航顺芯片推出HK32A040方案,赋能汽车矩阵大灯安全与智能化升级
  • Linux postgresql-15部署文档
  • 音频进阶学习九——离散时间傅里叶变换DTFT
  • 华为仓颉编程语言的函数与结构类型分析
  • Midjourney技术浅析(五):图像细节处理
  • 【大模型实战篇】GLM-Zero模型初代版本的尝鲜
  • SSM-Spring-IOC/DI对应的配置开发
  • 【Win】感觉“ctypes.WinDLL(“user32“)“跟“ctypes.windll.user32“看起来很像呀,它们之间有什么区别呢?
  • UL-SCH 处理函数
  • 关于今天发现的一个bug
  • 深入解析Android JNI:以Visualizer为例
  • Ragas自动化评测整体后端流程
  • 平凡的2024回顾
  • 【每日学点鸿蒙知识】广告ID、NFC手机充值、CSS支持语法、PC与模拟器交互、SO热更新等