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

ops/2025/1/19 4:15:52/

前言

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

??感兴趣的小伙伴看一看小编主页:-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接,并重写其所有法,那么具体的代码就是如下所示的:

 @Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("LoginInterceptor ?标?法执?前执?..");return true}@Overridepublic 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 {//注入拦截器@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**");}
}

解释:

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

注意:

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

??1.2拦截器的详解

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

1.拦截路径

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

代码如下所示:

@Configuration
public class WebConfig implements WebMvcConfigurer {//注入拦截器@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic 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 {//定义拦截器,重写方法@Overridepublic 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.配置拦截器
  @Overridepublic 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.ppmy.cn/ops/151271.html

相关文章

sql server 常用运维SQL

12.定位SQL查询SQL语句执行时间和IO消耗 SELECT s2.dbid, (SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 , ( (CASE WHEN statement_end_offset = -1 THEN (LEN(CONVERT(nvarchar(max),s2.text)) * 2) ELSE statement_end_offset END) - statement_start_offs…

初识JVM HotSopt 的发展历程

目录 导学 目前企业对程序员的基本要求 面向的对象 实战 学习目标 JVM 是什么 JVM 的三大核心功能 各大 JVM look 看一下虚拟机 HotSopt 的发展历程 总结 导学 目前企业对程序员的基本要求 面向的对象 实战 学习目标 JVM 是什么 JVM 的三大核心功能 即时编译 主要是…

什么情况下适合使用静态路由?什么情况下适合使用动态路由?_什么时候用静态路由什么时候用动态

2 静态路由 静态路由是由网络管理员根据网络拓扑&#xff0c;使用命令在路由器上配置的路由&#xff0c;这些静态路由信息指导报文发送&#xff0c;静态路由方式也无需路由器进行计算&#xff0c;但它完全依赖于网络管理员的手动配置。 补充一下&#xff0c;默认路由是一种特…

LeetCode100之搜索二维矩阵(46)--Java

1.问题描述 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回…

向harbor中上传镜像(向harbor上传image)

向 Harbor 中上传镜像通常分为以下几个步骤&#xff1a; 1、登录 Harbor 2、构建镜像 3、标记镜像 4、推送镜像到 Harbor 仓库 1、登录 Harbor 首先&#xff0c;确保你已经能够访问 Harbor&#xff0c;并且已经注册了账户。如果还没有 Harbor 账户&#xff0c;你需要先注册一…

1.6 阅读k8s源码的准备工作

准备工作 找个合适的ide 比如goland 下载k8s源码 项目地址 https://github.com/kubernetes/kubernetes可以git下载&#xff0c;也可以下载zip包&#xff0c;还可以go get 下载 git clone https://github.com/kubernetes/kubernetes.git 本教程基于k8s 1.21 版本 k8s组件代…

Java语言的软件工程

Java语言的软件工程 引言 在当今信息技术飞速发展的时代&#xff0c;软件工程作为一门应用广泛的学科&#xff0c;承担着开发高质量软件系统的重要责任。Java语言以其跨平台特性、安全性和强大的库支持&#xff0c;已经成为软件工程领域中最流行的编程语言之一。本文将深入探…

装饰器模式详解(附代码案例和源码分析)

目录 装饰器模式的本质 装饰器模式和继承结构的对比 源码中IO流的继承结构 具体装饰器类 装饰器的组合应用 装饰器链的特点 代码案例 定义coffee类型 coffee的实现类 装饰器抽象类 装饰器 - 季节限定 装饰器——加牛奶 装饰器——加糖 生成咖啡的简单工厂 咖…