【JavaEE进阶】Spring统一功能处理:拦截器的使用

目录

1.什么是拦截器?

2.拦截器的使用

2.1定义拦截器

2.2 注册配置拦截器

3.拦截器详解

3.1 拦截路径

3.2 拦截器的执行流程

4. 使用拦截器实现登录校验

4.1 定义拦截器

4.2 注册配置拦截器


1.什么是拦截器?

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

        也就是说, 允许开发人员提前预定义一些逻辑, 在用户的请求响应前后执行. 也可以在用户请求前阻止其执行.
        在拦截器当中,开发人员可以在应用程序中做一些通用性的操作, 比如通过拦截器来拦截前端发来的请求, 判断Session中是否有登录用户的信息. 如果有就可以放行, 如果没有就进行拦截.

比如我们去银行办理业务,在办理业务前后, 就可以加一些拦截操作
办理业务之前, 先取号, 如果带身份证了就取号成功
业务办理结束, 给业务办理人员的服务进行评价.
这些就是"拦截器"做的工作.

2.拦截器的使用

拦截器的使用步骤分为两步:

1.定义拦截器

2.注册配置拦截器

2.1定义拦截器

定义拦截器: 实现 HandlerInterceptor 接口, 并重写其所有方法

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Slf4j
public class LoginInterceptorTest implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("LoginInterceptor ⽬标⽅法执⾏前执⾏..");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {log.info("LoginInterceptor ⽬标⽅法执⾏后执⾏");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info("LoginInterceptor 视图渲染完毕后执⾏,最后执⾏");}
}

preHandle 中返回 true 和返回 false 的区别:

preHandle方法的返回值会影响目标方法的执行流程: 

  • 返回true:表示继续执行目标方法。如果preHandle方法返回true,则目标方法会继执行,整个请求处理流程会继续进行。

  • 返回false:表示中断目标方法的执行。如果preHandle方法返回false,则目标方法不会被执行,整个请求处理流程会被中断,后续的处理器方法和拦截器方法不会被执行。

总结

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

2.2 注册配置拦截器

 注册配置拦截器: 实现WebMvcConfigurer接口, 并重写addInterceptors方法

@Configuration
public class WebConfigTest implements WebMvcConfigurer {//自定义的拦截器对象@Autowiredprivate LoginInterceptorTest loginInterceptorTest;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册自定义的拦截器对象registry.addInterceptor(loginInterceptorTest).addPathPatterns("/**"); //设置拦截器的请求路径, (/**表示拦截所有请求)}
}

 在图书管理系统中引入上述拦截器的代码

在图书管理系统中点击登录按钮: 

此时拦截器代码的日志记录如下:

可以看到 preHandle 方法执行之后就放行了, 开始执行目标方法, 目标方法执行完成之后执行
postHandleafterCompletion 方法.

我们把拦截器中 preHandle 方法的返回值改为 false, 再观察运行结果

 可以看到, 拦截器拦截了请求, 没有进行响应.

3.拦截器详解

拦截器的入门程序完成之后,接下来我们来介绍拦截器的使用细节。拦截器的使用细节我们主要介绍两个部分:

1.拦截器的拦截路径配置
2.拦截器实现原理
 

3.1 拦截路径

拦截路径是指我们定义的这个拦截器, 对哪些请求生效. 

我们在注册配置拦截器的时候,通过 addPathPatterns() 方法指定要拦截哪些请求. 也可以通过excludePathPatterns() 指定不拦截哪些请求.

上述代码中,我们配置的是 / ** ,表示拦截所有的请求.

比如用户登录校验,我们希望可以对除了登录之外所有的路径生效.

@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/user/login")     //排除掉不需要拦截的路径.excludePathPatterns("/css/**")         //排除掉不需要拦截的路径.excludePathPatterns("/js/**")          //排除掉不需要拦截的路径.excludePathPatterns("/pic/**")         //排除掉不需要拦截的路径.excludePathPatterns("/**/*.html")      //排除掉不需要拦截的路径;}
}

在拦截器中除了可以设置 / ** 拦截所有资源外,还有一些常见拦截路径设置:

 以上拦截规则可以拦截此项目中的使用URL, 包括静态文件(图片文件, JS和CSS等文件).

3.2 拦截器的执行流程

正常的调用顺序:

                       

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

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

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

4. 使用拦截器实现登录校验

学习拦截器的基本操作之后,接下来我们需要完成最后一步操作: 通过拦截器来完成图书管理系统中的登录校验功能

4.1 定义拦截器

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

import com.example.com.constant.Constants;
import com.example.com.model.UserInfo;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {/*** 请求处理前执行的逻辑* true : 表示放行, 不进行拦截* false: 表示拦截, 不进行下一步处理*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("LoginInterceptor priHandle.....");//获取session 并且判断session中存储的userInfo信息是否为空HttpSession session = request.getSession();// getSession(true): session存在就返回, 不存在就创建一个新的session返回 默认是true// getSession(false): session存在就返回, 不存在就返回空UserInfo userInfo = (UserInfo) session.getAttribute(Constants.USER_SESSION_KEY);if(userInfo == null || userInfo.getId() <= 0) {//用户未登录response.setStatus(401);return false;}return true;}
}

4.2 注册配置拦截器

import com.example.com.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/user/login")     //排除掉不需要拦截的路径.excludePathPatterns("/css/**")         //排除掉不需要拦截的路径.excludePathPatterns("/js/**")          //排除掉不需要拦截的路径.excludePathPatterns("/pic/**")         //排除掉不需要拦截的路径.excludePathPatterns("/**/*.html")      //排除掉不需要拦截的路径;}
}

也可以改写成:

import com.example.com.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.Arrays;
import java.util.List;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;private List<String> excludePaths = Arrays.asList("/user/login","/css/**","/js/**","/pic/**","/**/*.html");@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns(excludePaths)     //排除掉不需要拦截的路径;}
}

以上代码在项目中的位置:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI赋能前端:你的Chrome 控制台需要AI(爱)

像会永生那样去学习,像明天就要死亡那样去生活。——圣雄甘地 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 AI(Gemini)ChromeDevTool🪜魔法接码平台因为,行文字数所限,有些概念可能会一带而过亦或者提供对应的学习…

[【机器学习】深度概率模型(DPM)原理和文本分类实践

1.引言 1.1.DPM模型简介 深度概率模型&#xff08;Deep Probabilistic Models&#xff09; 是结合了深度学习和概率论的一类模型。这类模型通过使用深度学习架构&#xff08;如神经网络&#xff09;来构建复杂的概率分布&#xff0c;从而能够处理不确定性并进行预测。深度概率…

【Android】多种方式实现截图(屏幕截图、控件截图、长图)

目录 1. View截图2. WebView截图3. 屏幕截图格式转换方法 Android 截图主要为四种&#xff1a;View 截图、WebView 截图、屏幕截图、系统截图和 adb 截图。后两种截图不常用&#xff0c;不详细展开。 1. View截图 可以截取到View不可见的部分&#xff0c;生成长图&#xff0c…

docker官方源无法使用的解决办法

使用官方源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 安装docker报错 Loaded plugins: fastestmirror, priorities Loading mirror speeds from cached hostfile https://download.docker.com/linux/centos/7/x86_64/stable/re…

刘亦菲新剧玫瑰的故事

刘亦菲新剧《玫瑰的故事》&#xff1a;开放结局&#xff0c;无限遐想 当刘亦菲再次踏入荧屏&#xff0c;与导演汪俊携手打造的《玫瑰的故事》便引发了无数观众的期待与关注。这部剧不仅汇聚了众多实力派演员&#xff0c;更以其独特的剧情和精致的制作成为了近期热门的话题。《…

网络编程(TCP协议,UDP协议)

目录 网络编程三要素 IP IPv4 InetAddress类 端口号 协议 UDP协议 UDP协议发送数据 UDP协议接收数据 UDP的三种通信方式(代码实现) TCP协议 TCP通信程序 三次握手和四次挥手 练习 1、客户端:多次发送数据服务器:接收多次接收数据&#xff0c;并打印 2、客户端…

cad批量打印pdf怎么弄?介绍三种打印方法

cad批量打印pdf怎么弄&#xff1f;在CAD设计领域&#xff0c;批量打印PDF文件是一项常见且至关重要的任务。面对大量的CAD图纸&#xff0c;如何高效地进行转换和打印&#xff0c;成为了设计师们亟待解决的问题。今天&#xff0c;我们就来推荐三款能够批量打印PDF的CAD软件&…

最新扣子(Coze)实战案例:扣子卡片的制作及使用,完全免费教程

&#x1f9d9;‍♂️ 大家好&#xff0c;我是斜杠君&#xff0c;手把手教你搭建扣子AI应用。 &#x1f4dc; 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》&#xff0c;完全免费学习。 &#x1f440; 关注斜杠君&#xff0c;可获取完整版教程。&#x1f44d;&#x1f3f…

面对不断变化的安全标准和威胁,Cobol 程序应采取哪些措施来加强其安全性和防护能力?

面对不断变化的安全标准和威胁&#xff0c;Cobol 程序可以采取以下措施来加强其安全性和防护能力&#xff1a; 更新和升级&#xff1a;定期更新和升级Cobol编译器和开发环境&#xff0c;以获取最新的安全性改进和修补程序。 安全审计&#xff1a;定期进行安全审计&#xff0c;…

对红酒数据集,分别采用决策树算法和随机森林算法进行分类。

1.导入所需要的包 from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split 2.导入数据&#xff0c;并且对随机森林和决策数进…

深入解析Spring Cloud的常用插件和注解(下)

在上一篇文章中&#xff0c;我们介绍了Spring Cloud的一些常用插件及其配置和使用。本文将继续探讨Spring Cloud的常用注解及其在实际开发中的应用。 2. Spring Cloud的常用注解 2.1 EnableEurekaServer 该注解用于启动一个Eureka Server&#xff0c;使得其他微服务可以注册…

后端程序员的Linux命令指南

后端程序员的终极命令指南&#xff1a;考考自己是不是真正掌握Linux的使用 欢迎各位穿着格子衬衫&#xff0c;常年抱着键盘睡觉的后端小伙伴们&#x1f44b;&#x1f44b;&#x1f44b;&#xff01;今天&#xff0c;考考你们是不是掌握以下让你们在日后在服务器上叱咤风云的命令…

关于微信小程序取消获取用户昵称的一些思考

官方说明&#xff0c;有部分小程序乱用授权&#xff0c;强迫用户提交头像和昵称。 核心是微信担心用户信息被滥用。 其一 &#xff0c;微信头像经常是本人真是照片&#xff0c;在现在人工智能算法的加持下&#xff0c;人脸数据太容易被套取。 其二&#xff0c;微信名称同理&…

Gobject tutorial 九

The GObject messaging system Closures closure是一个抽象、通用的概念&#xff0c;它包含一个函数和一些变量。作用就是实现函数回调功能。 我们看看GLib对closure是怎么定义的。 /*** GClosure:* in_marshal: Indicates whether the closure is currently being invoked…

pip install镜像源(更新和换源)

pip install镜像源&#xff08;更新和换源&#xff09; 1.pip安装依赖包默认访问的源&#xff1a; 因为服务器架设在国外的缘故&#xff0c;很多时候不好用网速不行&#xff0c;这时候就需要选择国内的一些安装源安装相应的包 https://pypi.Python.org/simple/2.设置默认源 …

【React】useState 更新延迟的原因是什么,怎么解决?

useState 更新延迟的原因 异步更新:React 中的 useState 更新是异步的,这意味着当你调用更新函数(如 setData)时,React 并不立即同步更新状态,而是将其放入一个待处理的队列中,稍后在适当的时候(如在下一次渲染之前)进行处理。因此,如果你尝试在调用更新函数后立即读…

CVPR 2024第三弹:小编与李飞飞教授惊喜同框,CVPR之家乐队火爆演奏惊艳全场

CVPR 2024第三弹&#xff1a;小编与李飞飞教授惊喜同框&#xff0c;"CVPR之家"乐队火爆演奏惊艳全场&#xff01; 会议之眼 快讯 2024 年 CVPR &#xff08;Computer Vision and Pattern Recogntion Conference) 即国际计算机视觉与模式识别会议&#xff0c;于6月1…

最新评测:2024年13款国内外缺陷跟踪管理工具(含免费/开源)

文章中介横向对比了11款主流缺陷管理工具&#xff1a;1. PingCode&#xff1b;2. Worktile&#xff1b;3. Jira&#xff1b;4. ZenTao&#xff08;禅道&#xff09;&#xff1b;5. Bugzilla&#xff1b;6. Redmine&#xff1b;7. Tapd&#xff1b;8. MantisBT&#xff1b;9. Tr…

AttributeError: ‘ImageDraw‘ object has no attribute ‘textsize‘

python项目生成词云图的时候报错&#xff1a;AttributeError: ‘ImageDraw’ object has no attribute ‘textsize’ 解决办法 出现这个问题&#xff0c;可能是因为Pillow版本过高导致的&#xff0c;我们可以尝试通过降低Pillow的版本来解决它。 我通过将Pillow版本降低到9.4.…

贴图法美化Button按钮

贴图法美化Button按钮 项目是在下面这篇文章里的基础上进行美化的&#xff1a;MFC实现INI配置文件的读取 1. 初始效果 2.最终效果 3. 增加 CImgButton 类 1.1 ImgButton.h 头文件 #pragma once // CImgButtonclass CImgButton : public CBitmapButton {DECLARE_DYNAMIC(CImgBu…