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$ 需要适应用户的需求。 为了满足用户需求,公司需要调整屏幕尺寸…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...