SpringMVC(六)拦截器
目录
1.什么是拦截器
2.拦截器和过滤器有哪些区别
3.拦截器方法
4.单个拦截器的执行流程
5.使用拦截器实现用户登录权限验证(实例)
1.先在html目录下写一个login.html文件
2.在controller包下写一个LoginController文件
3.加拦截器
1.创建一个config-LoginInterceptor文件:
2在springMV.xml文件当中配置拦截器
3.重启服务器测验
6.多个拦截器的执行流程
1.什么是拦截器
SpringMVC提供了Intercepter拦截器机制,类似于Servlet当中的Filter过滤器,用于拦截用户的请求并作出相应的处理,比如通过拦截器来进行用户权限验证或者用来判断用户是否登录。SpringMVC拦截器是可插拔式的设计,需要某一功能拦截器,就需要在配置文件中应用拦截器即可;如果不需要这个功能拦截器,只需要在配置文件中取消该拦截器即可。
2.拦截器和过滤器有哪些区别
请求从外向内打到Controller层,Filter起到了对请求的最基础的过滤;Interceptor是拦截器。
1.过滤器依赖于servlet,而拦截器技术属于SpringMVC
2.过滤器可对所有请求起作用,拦截器只对访问controller层的请求起作用。
3.过滤器会比拦截器先执行。拦截器(Interceptor)是在Servlet和Controller控制器之间执行;而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行。

3.拦截器方法
想要自定义拦截器,需要实现HandlerInterceptor接口。

我们可以看到 HandlerInterceptor接口有三个方法,分别是preHandle、postHandle、afterCompletion,关于这三个方法(拦截器就是实现这三个方法)
- preHandle 方法:该方法在执行器方法之前执行。返回值为Boolean类型,如果返回false,表示拦截,不再向下执行;如果返回true,表示放行,程序向下执行(如果后边没有其他Interceptor,就会执行Controller方法)。所以,此方法可对方法进行判断,决定程序是否继续执行,或者进行一些初始化操作及对请求进行预处理。
- postHandle方法:该方法在执行控制器方法调用之后,且在返回ModelAndView之前执行。由于该方法会在DispatcherServlet进行返回视图渲染之前被调用,所以此方法多被用于处理返回的视图,可通过此方法多被用于处理返回的视图,可通过此方法对请求域中的模型和视图做进一步的修改。
- afterCompletion方法:该方法在执行完控制器之后执行。由于是在Controller方法执行完毕之后执行该方法,所以该方法适合进行一些资源清理、记录日志信息等处理操作。
4.单个拦截器的执行流程
程序首先会执行拦截器类中的preHandle()方法,如果该方法的返回值true,则程序继续向下执行处理器当中的方法,否则不在向下执行;业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向前端返回响应;在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。

5.使用拦截器实现用户登录权限验证(实例)

当前用的项目还是之前配置的:
1.先在html目录下写一个login.html文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录页面</title>
</head>
<body>
<form action="/StringMVCTestTwice/login/login" method="post">name:<input type="text" name="name"/>password:<input type="password" name="password"/><input type="submit" value="登录"/>
</form>
</body>
</html>
2.在controller包下写一个LoginController文件
package controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;import javax.servlet.http.HttpSession;@Controller
@RequestMapping("/login") //一级请求
public class LoginController {@RequestMapping("/toLogin")public String toLogin(){return "login";}@RequestMapping(value = "/login",method = {RequestMethod.POST})//二级请求(注意这里是get/post都可以,主要是要和前端中相对应)public String login(String name,String password,HttpSession session){if(name.equals("admin")&&password.equals("123456")){return "test"; //随便选一个假设测试即可}else{return "login";}}}
这两个就实现了一个普通简单逻辑的登陆界面,现在去加上拦截器:
3.加拦截器
1.创建一个config-LoginInterceptor文件:

并配置代码:
package config;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;//登录拦截类
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取请求urlString url = request.getRequestURI();//非登录请求进行拦截if (!url.contains("login")){//非登录请求获取sessionif(request.getSession().getAttribute("key") != null){ //和创建的session值相对应return true;//说明已经登录,放行}else { //没有登录,跳转到登录页面request.setAttribute("msg","您还没登录。请先登录。。。");request.getRequestDispatcher("/html/login.html").forward(request,response);}}else {return true; //登录请求,放行}return true;}//省略了postHandle()和afterCompletion()方法
}
2在springMV.xml文件当中配置拦截器
<!--配置拦截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/> <!--/**表示所有url--><bean class="config.LoginInterceptor"/></mvc:interceptor></mvc:interceptors>
3.重启服务器测验
此时只要不是login路径下且未登录过的页面或请求一律拦截并且跳转到login.html界面:

正常登录后,跳转到test.html界面:
此时登录过一遍后,带有了session值,此刻再点击进入其他界面,就能直接进入了:

6.多个拦截器的执行流程
当多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行。
假设有两个拦截器Interceptor1和interceptor2,并且在配置文件中,Interceptor1拦截器配置在前。

相关文章:
SpringMVC(六)拦截器
目录 1.什么是拦截器 2.拦截器和过滤器有哪些区别 3.拦截器方法 4.单个拦截器的执行流程 5.使用拦截器实现用户登录权限验证(实例) 1.先在html目录下写一个login.html文件 2.在controller包下写一个LoginController文件 3.加拦截器 1.创建一个conf…...
单区域OSPF配置实验
1、绘制拓扑图 2、配置ip地址 R0 Router(config)#interface FastEthernet0/0 Router(config-if)#ip address 192.168.1.1 255.255.255.0 Router(config-if)#no shutdown Router(config-if)#exit Router(config)#interface FastEthernet0/1 Router(config-if)#ip address 192.16…...
Linux上vi(vim)编辑器使用教程
vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim)。vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率。vi是“visual interface”的缩写,vim是vi IMproved(增强版的vi)。在一般的系统管理维护中vi就够用,如果想使用…...
虚拟机图像界面打不开了
今天打开虚拟机的时候图形界面打不开,进入到tty1中,而且还没有网,找了好几个办法都不行最后找到这个博主发的,解决了 修复 https://www.cnblogs.com/shuimuqingyang/p/15070690.html...
《经典力学》笔记
文章目录 直线运动弹簧和简谐运动动能,势能,机械能动量动量守恒机械能守恒弹性碰撞和非弹性碰撞冲量 圆周运动匀速圆周运动转动惯量平行轴定理 角动量角动量守恒 英语 直线运动 弹簧和简谐运动 F s → − k x 1 → \overrightarrow{F_s}-k \overrighta…...
【论文+源码】基于Spring和Spring MVC的汉服文化宣传网站
为了实现一个基于Spring和Spring MVC的汉服文化宣传网站,我们需要创建一个简单的Web应用程序来展示汉服文化和相关信息。这个系统将包括以下几个部分: 数据库表设计:定义文章、用户和评论的相关表。实体类:表示数据库中的数据。DAO层接口及MyBatis映射文件:用于与数据库交…...
计算机的错误计算(一百九十九)
摘要 用大模型判断下面四个函数 有何关系?并计算它们在 x0.00024时的值,结果保留10位有效数字。两个大模型均认为它们是等价的。实际上,还有点瑕疵。关于计算函数值,大模型一只是纸上谈兵,没计算;大模型二…...
【AI日记】25.01.02 kaggle 比赛 3-1
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加:kaggle 比赛 Forecasting Sticker Sales时间:4 小时 读书 书名:秦制两千年时间:5 小时阅读原因:之前看过 《商君书》,对秦制…...
el-pagination 为什么只能展示 10 条数据(element-ui@2.15.13)
好的,我来帮你分析前端为什么只能展示 10 条数据,以及如何解决这个问题。 问题分析: pageSize 的值: 你的 el-pagination 组件中,pageSize 的值被设置为 10:<el-pagination:current-page"current…...
Ps:将数据组作为文件导出
Ps菜单:文件/导出/数据组作为文件 Export/Data Sets as Files “将数据组作为文件导出” Export Data Sets as Files命令是 Photoshop 数据驱动设计功能的一部分,用于结合可变数据和模板,生成多个文件。 1、自动化批量生成 适用于名片、证书、…...
nohup.out日志
1、nohup.out生成 在你执行 nohup java -jar ruoyi-admin.jar & 时,程序原本要输出到控制台的所有内容,包括日志框架输出到控制台的部分,都会被写入 nohup.out 。nohup 命令运行程序时,默认情况下,nohup 会把程序的…...
01 背包
文章目录 前言代码思路 前言 总是感觉有点没有完全懂,但是说起来的时候好像又懂一点点,就是我现在的状态。 代码 二维的直接的版本 #include<iostream> #include<algorithm>using namespace std;const int N 1010; int f[N][N]; int v[…...
QT-------------多线程
实现思路 QThread 类简介: QThread 是 Qt 中用于多线程编程的基础类。可以通过继承 QThread 并重写 run() 方法来创建自定义的线程逻辑。新线程的执行从 run() 开始,调用 start() 方法启动线程。 掷骰子的多线程应用程序: 创建一个 DiceThre…...
【JVM】深入了解Java虚拟机-------内存划分、类加载机制、垃圾回收机制
目录 什么是JVM? 内存划分: 1.堆 (共享) 2.栈 (私有) 3.元数据区(共享) 4.程序计数器(私有) 示例: JVM 类加载 一.类加载过程 1.加载 2.验证 3.…...
k8s部署juicefs
操作系统k8smysqlminiojuicefs内核centos8.21.19.18.0.39RELEASE.2023-12-20T01-00-02Zv0.19.04.18.0-193.el8.x86_64 本文k8s较老采用老版本的juicefs,中间件也都是部署在k8s上。测试是否能成功创建动态pvc挂在到测试pod当中并查看到数据信息。一些偏理论知识就不多…...
【ArcGIS微课1000例】0136:制作千层饼(DEM、影像、等高线、山体阴影图层)
文章目录 一、效果展示二、数据准备三、制作过程1. 打开软件2. 制作DEM图层3. 制作影像层4. 制作TIN层5. 制作等高线层四、注意事项一、效果展示 二、数据准备 订阅专栏后,从专栏配套案例数据包中的0136.rar中获取。 1. dem 2. 影像 3. 等高线 4. tin 三、制作过程 1. 打开软…...
Ajax数据爬取
有时我们用requests 抓取页面得到的结果,可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,而使用requests 得到的结果中并没有这些数据。这是因为 requests 获取的都是原始 HTML 文档,而浏览器中的页面是JavaScript 处理…...
快速上手大模型的对话生成
本项目使用0.5B小模型,结构和大模型别无二致,以方便在如CPU设备上快速学习和上手大模型的对话上传 #mermaid-svg-Z86hUiQZ0hg9BVji {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Z86hUiQZ0h…...
DateTimeExtensions:一个轻量C#的开源DateTime扩展方法库
推荐一个专门为System.DateTime编写的扩展方法库。 01 项目简介 该项目主要是为System.DateTime和System.DateTimeOffset的编写的扩展方法,包括自然日期差值的文本表示(精确和人性化四舍五入)、多个时区的节假日和工作日计算。 核心扩展方…...
题解:监控屏幕调整问题
问题描述 Reca 公司生产高端显示器,其中最受欢迎的型号是 AB999。屏幕尺寸为 $x \times y$ 的比例。由于某些生产特性,屏幕参数总是整数。最终,屏幕边长比例 $x:y$ 需要适应用户的需求。 为了满足用户需求,公司需要调整屏幕尺寸…...
小学期第一周学习记录
这周自学了Multisim仿真软件,完成了555方波发生器二阶低通滤波器的搭建,成功实现了方波到正弦波的转换。学习过程1. 555方波发生器搭建参考课本公式 f ≈ 1.44 / ((R12R2)C1) 设计参数,一开始因为电容单位看错(把nF写成μF&…...
Xiaomusic终极指南:如何通过5个技术模块实现小爱音箱智能音乐播放
Xiaomusic终极指南:如何通过5个技术模块实现小爱音箱智能音乐播放 【免费下载链接】xiaomusic 使用小爱音箱播放音乐,音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 还在为传统音乐播放器的复杂操作和功能…...
【技术解析】VadCLIP:如何让视觉语言模型“看懂”视频异常?
1. VadCLIP是什么?为什么视频异常检测需要它? 想象一下你正在监控室盯着几十块屏幕,突然有个画面闪过一个可疑行为——可能是打架、偷窃或者交通事故。传统监控系统要么依赖人工盯屏(容易疲劳漏检),要么使用…...
挑战 100ms 延迟极限:深度拆解 dograh,构建企业级开源 WebRTC 实时语音智能体平台
发布日期: 2026-05-18标签: #VoiceAgent #WebRTC #语音智能体 #dograh #大模型 #实时音视频一、 引言在 2026 年,随着大模型多模态能力的爆发,传统的“打字输入、文字输出”交互模式正迅速向“纯语音实时对讲”演进。然而…...
基于改进型PCNN的不规则图像自适应分割算法研究
基于改进型PCNN的不规则图像自适应分割算法研究根据论文中的相关内容,以下是使用不同方法解决图像分割问题并进行改进的研究:冯登超等人提出了基于改进型脉冲耦合神经网络(PCNN)的自适应分割算法。他们在原有PCNN模型的基础上对神…...
KVQuant:突破LLM推理显存瓶颈的KV Cache量化技术详解
1. 项目概述:KVQuant是什么,以及它为何重要如果你最近在折腾大语言模型(LLM)的本地部署、微调或者推理优化,大概率已经对“KV Cache”这个名词不陌生了。随着模型参数规模从几十亿飙升到上千亿,推理过程中的…...
如何轻松突破Windows限制:WinRing0硬件访问终极实战指南
如何轻松突破Windows限制:WinRing0硬件访问终极实战指南 【免费下载链接】WinRing0 WinRing0 is a hardware access library for Windows. 项目地址: https://gitcode.com/gh_mirrors/wi/WinRing0 你是否曾经在开发Windows应用时,需要直接访问硬件…...
别再手动画图表了!用这套Figma可视化组件库7.0,5分钟搞定大屏设计稿
别再手动画图表了!用这套Figma可视化组件库7.0,5分钟搞定大屏设计稿 凌晨3点的设计工作室里,咖啡杯已经空了第三轮。李然盯着屏幕上那个反复修改了7次却始终不够"科技感"的柱状图,突然意识到——设计师的时间不该浪费在…...
魔兽争霸3终极优化指南:7步让你的经典游戏在现代电脑上焕发新生
魔兽争霸3终极优化指南:7步让你的经典游戏在现代电脑上焕发新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为一款经典的即…...
3步搞定Linux启动盘:Deepin Boot Maker完全使用指南
3步搞定Linux启动盘:Deepin Boot Maker完全使用指南 【免费下载链接】deepin-boot-maker 项目地址: https://gitcode.com/gh_mirrors/de/deepin-boot-maker 在Linux系统安装和维护过程中,启动盘制作是一个看似简单却充满挑战的环节。传统命令行工…...
