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

SpringMVC拦截器

SpringMVC拦截器

介绍

拦截器(interceptor)的作用

SpringMVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器 进行预处理后处理

将拦截器按一定的顺序连接成一条链,这条链称为拦截器链(Interception Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器链就会按其之间定义的顺序被调用。拦截器也是AOP思想的具体实现

拦截器和过滤器之间的区别

区别过滤器(Filter)拦截器(Interceptor)
使用范围是servlet规范中的一部分,任何java web工程都可以使用是SpringMVC框架自己的,只有使用来了SpringMVC框架的工程才可以使用
拦截范围在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截在<mvc:mapping path=“”/>中配置了/**之后,也可以对所有的资源进行拦截,但是可以通过<mvc:exclude-mapping path=“” />标签排除不需要拦截资源

快速入门

自定义拦截器只有三步:

  • 创建拦截器类实现HandlerInterception接口
  • 配置拦截器
  • 测试拦截器的拦截效果

代码实现

1、创建拦截器类实现HandlerInterceptor接口

public class MyhandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle running....");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandler running...");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion running...");}
}

2、配置拦截器

    <mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="interceptor.MyhandlerInterceptor"/></mvc:interceptor></mvc:interceptors>

3、测试拦截器的拦截效果(编写目标方法)

@Controller
public class TestController {@RequestMapping("/test")@ResponseBodypublic String save() {System.out.println("目标方法执行...");return "index";}
}

http://localhost:8080/test

img

多拦截器操作

同上,在编写一个MyHandlerInterceptor1操作,测试执行顺序

img

拦截器方法说明

方法名说明
preHandler()方法将在请求处理之前进行调用,该方法的返回值是布尔值Boolean类型的,当它返回为false时,表示请求结束,后续的Interceptor和Controller都不会再执行;当返回值为true时就会继续调用下一个Interceptor的preHandle方法
postHandler()该方法是在当前请求进行处理之后被调用,前提是preHandler方法的返回值为true时才能被调用,且它会在DispatcherServlet进行视图返回渲染之前被调用,所以可以在这个方法中对Controller处理之后的ModelAndView对象进行操作
afterCompletion()该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行,前提是preHandler方法的返回值为true时才能调用

案例

用户登录权限控制

需求:用户没有登录得情况下,不能对后台菜单进行访问操作,点击菜单跳转到登录页面,只有用户登录成功之后,才能进行后台功能得操作

public class PrivilegeInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 逻辑:判断 用户是否登录 本质:判断session中有没有userHttpSession session = request.getSession();User user = (User) session.getAttribute("user");if (user == null) {// 没有登录response.sendRedirect(request.getContextPath() + "/login.jsp");return false;}// 放行 访问目标资源return true;}
}

拦截器配置

    <mvc:interceptors><mvc:interceptor><!--配置那些资源需要拦截--><mvc:mapping path="/**"/><!--配置那些资源需要排除--><mvc:exclude-mapping path="/user/login"/><bean class="com.dc.interceptor.PrivilegeInterceptor"/></mvc:interceptor></mvc:interceptors>

UserController

@RequestMapping("/user")
@Controller
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/login")public String login(String username, String password, HttpSession session) {User login = userService.login(username, password);System.out.println(login);if (login != null) {session.setAttribute("user", login);return "redirect:/index.jsp";}return "redirect:/login.jsp";}
}

Service

public interface UserService {User login(String username, String password);
}public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic User login(String username, String password) {try {return userDao.login(username, password);} catch (EmptyResultDataAccessException e) {return null;}}
}

Dao层

public interface UserDao {User login(String username, String password);
}public class UserDaoImpl implements UserDao {private JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate){this.jdbcTemplate = jdbcTemplate;}@Overridepublic User login(String username, String password) throws EmptyResultDataAccessException {User user = jdbcTemplate.queryForObject("select * from sys_user where username = ? and password = ?", new BeanPropertyRowMapper<User>(User.class), username, password);return user;}
}

img

相关文章:

SpringMVC拦截器

SpringMVC拦截器 介绍 拦截器&#xff08;interceptor&#xff09;的作用 SpringMVC的拦截器类似于Servlet开发中的过滤器Filter&#xff0c;用于对处理器 进行预处理和后处理 将拦截器按一定的顺序连接成一条链&#xff0c;这条链称为拦截器链&#xff08;Interception Ch…...

Python第八章作业(初级)

目录 第1关&#xff1a;统计字母数量 第2关&#xff1a;统计文章字符数 第3关&#xff1a;查询高校信息 第4关&#xff1a;查询高校名 第5关&#xff1a;通讯录读取 第6关&#xff1a;JSON转列表 第7关&#xff1a;利用数据文件统计成绩 第8关&#xff1a;研究生录取数据…...

chatgpt赋能python:Python中如何取消列表

Python中如何取消列表 在Python中使用列表是一种非常常见的数据结构&#xff0c;它允许我们在其中存储任意数量的元素&#xff0c;并且可以非常容易地进行遍历和操作。但是&#xff0c;有时候我们需要从列表中删除元素。这个过程并不难&#xff0c;但是有些细节需要注意。本文…...

Java中List排序的3种方法

在某些特殊的场景下&#xff0c;我们需要在 Java 程序中对 List 集合进行排序操作。比如从第三方接口中获取所有用户的列表&#xff0c;但列表默认是以用户编号从小到大进行排序的&#xff0c;而我们的系统需要按照用户的年龄从大到小进行排序&#xff0c;这个时候&#xff0c;…...

flutter-读写二进制文件到设备

看了下很多文章&#xff0c;本地文件存储都只有存储txt文件&#xff0c;我们探索下存储二进制文件吧。 保存二进制文件到设备硬盘上。 我们保存一个图片到手机本地上&#xff0c;并读取展示图片到app上。 以百度logo图为例子 写入图片 逻辑如下&#xff1a; 获取本地路径 -&g…...

C语言基础知识:内存分配

目录 内存分配原理 内存分配方法 静态内存分配 动态内存分配 MALLOC() CALLOC() 内存释放 注意事项 在C语言中&#xff0c;内存分配是非常重要的一个概念&#xff0c;因为C语言中没有内置的垃圾回收机制&#xff0c;需要我们手动管理内存的分配和释放。下面我们来详细讲…...

【Simulink】示波器图形数据导入Matlab重新绘图(论文)

版本&#xff1a;Matlab2019b 效果 示波器波形图片&#xff1a; 黑色背景&#xff0c;而且坐标轴字体较小&#xff0c;不方便修改&#xff0c;不能直接用在论文上面 对比 Matlab 绘图&#xff1a; 接下来介绍如何设置~ Simulink 设置 选择需要导入的示波器数据 点击 Vi…...

汇编调试及学习

汇编调试 打印寄存器的值 打印内存地址 打印8字节&#xff0c;就是64位 打印格式 是从低位取过来的 b 字节 h 双字节 w四字节 g八字节 前变基 后变基 。 后变基这个变基会发生变化的。前变基变基不会发生变化需要用&#xff01;号。 前变基 &#xff0c; 加了&#xff0…...

Linux - 第19节 - 网络基础(传输层二)

1.TCP相关实验 1.1.理解listen的第二个参数 在编写TCP套接字的服务器代码时&#xff0c;在进行了套接字的创建和绑定之后&#xff0c;需要调用listen函数将创建的套接字设置为监听状态&#xff0c;此后服务器就可以调用accept函数获取建立好的连接了。其中listen函数的第一个参…...

web实现日历、阳历农历之间相互转换、npm、push、unshift、includes、innerHTML

文章目录 1、原生web实现效果图htmlJavaScriptstyle vue2实现htmlJavaScript 1、原生web实现 效果图 html <div class"box"><div class"week"><div>星期日</div><div>星期一</div><div>星期二</div><…...

GcExcel v6.1 支持新的 ‘.sjs‘ 模板文件 ‘.xltx‘ 格式 Crack

GrapeCity Documents for Excel (GcExcel) v6.1 版本现已上线&#xff01;该版本支持新的 SpreadJS .sjs 文件格式和 Excel 模板文件 .xltx 格式。此外&#xff0c;GcExcel 支持更多的SpreadJS兼容性功能和对 GcDataViewer 的多项增强。看看下面的主要亮点。 导入/导出 Spread…...

面试官:MySQL自增主键一定是连续的吗?

测试环境&#xff1a; MySQL版本&#xff1a;8.0 数据库表&#xff1a;T &#xff08;主键id&#xff0c;唯一索引c&#xff0c;普通字段d&#xff09; 如果你的业务设计依赖于自增主键的连续性&#xff0c;这个设计假设自增主键是连续的。但实际上&#xff0c;这样的假设是错的…...

2023ACP世界大赛教育者论坛:让职业教育直面AI机遇与挑战

“AI技术的普及对创意行业和教育带来的影响和变革-2023 Adobe Certified Professional教育者论坛”在苏州西交利物浦大学成功举办。 本次论坛&#xff0c;由Adobe Certified Professional 世界大赛中国赛区组委会主办&#xff0c;联动了来自院校、海内外杰出的创意公司及国际知…...

Unity基础 音频组件以及音频播放

在游戏开发中&#xff0c;声音是一个重要的环节。Unity中的声音组件可以帮助开发者轻松地控制游戏中音频的播放、音量、循环等属性&#xff0c;从而实现更好的游戏体验。本文将详细介绍Unity声音组件的相关概念和技术&#xff0c;以及其在游戏、影视等领域的广泛应用和发展前景…...

SAP-MM-采购申请审批那些事!

1、ME55不能审批删除行项目的PR 采购申请审批可以设置行项目审批或抬头审批。如果设置为抬头审批时&#xff0c;ME55集中审批时&#xff0c;就会发现有些采购申请时不能审批的&#xff0c; 那么这些采购申请时真的不需要审批么&#xff1f;不是的&#xff0c;经过核对这些采购申…...

专业解读财务共享实现财务数智化转型的有效路径

近年来&#xff0c;随着数字经济的飞速发展&#xff0c;各大企业全面开启数智化转型之路&#xff0c;作为企业数智化转型的重要内容&#xff0c;财务数智化转型始于财务共享服务。然而&#xff0c;财务共享建设并不是一蹴而就的&#xff0c;如何通过财务共享实现财务数智化转型…...

九章云极DataCanvas公司诚邀您共享AI基础软件前沿技术盛宴

“杭州通用人工智能论坛暨AIIA人工智能产业发展大会”将于2023年5月30日-31日在杭州举办。本次人工智能产业发展大会由中国信息通信研究院、中国人工智能产业发展联盟主办&#xff0c;杭州城西科创大走廊管委会、杭州市经济和信息化局、杭州未来科技城管理委员会、人工智能关键…...

【高级语言程序设计(一)】第 10 章:文件

目录 一、文件概述 &#xff08;1&#xff09;文件定义 &#xff08;2&#xff09;文件命名 &#xff08;3&#xff09;文件分类 ① 按照文件的内容划分 ② 按照文件的组织形式划分 ③ 按照文件的存储形式划分 ④ 按照文件的存储介质划分 &#xff08;4&#xff09;文…...

Android 宿主启动插件中的Activity和Service

在宿主App中加载插件App中的四大组件&#xff0c;需要以下几个步骤&#xff1a; 1. 预先在宿主的AndroidManifest文件中声明插件中的四大组件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.co…...

00后卷王自述,我真的很卷吗?

前段时间我去面试了一个软件测试公司&#xff0c;成功拿到了offer&#xff0c;薪资也从10k涨到了18k&#xff0c;对于工作都还没两年的我来说&#xff0c;还是比较满意的&#xff0c;毕竟有些工作了3到4年的可能还没有我的高。 在公司一段时间后大家都说我是卷王&#xff0c;其…...

3大创新突破:Element-Plus-X助力企业级AI交互应用的实战指南

3大创新突破&#xff1a;Element-Plus-X助力企业级AI交互应用的实战指南 【免费下载链接】Element-Plus-X Enterprise-level AI component library front-end solution &#x1f916; 项目地址: https://gitcode.com/gh_mirrors/el/Element-Plus-X 在数字化转型加速的今…...

[x-cmd] 写给计算机科学爱好者的 x-cmd 入门指南

写给计算机科学爱好者的 x-cmd 入门指南 为什么要用 命令行 整合多样能力: 当你长期只需要做一件事时&#xff0c;其实只需熟悉这项业务的图形用户界面&#xff08;例如一个网页控制台&#xff09;&#xff1b;但如果要处理多项业务时: 例如&#xff0c;在开发时&#xff0c;…...

OmenSuperHub:暗影精灵游戏本硬件控制的开源革新方案

OmenSuperHub&#xff1a;暗影精灵游戏本硬件控制的开源革新方案 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度&#xff0c;自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 一、问题引入&#xff1a;原厂硬件控制软…...

如何通过HFS哈氏训练改善注意力缺陷儿童的集中程度?

通过HFS哈氏训练提升注意力缺陷儿童的集中技巧 HFS哈氏训练是一种针对注意力缺陷儿童的有效方法&#xff0c;旨在提升他们的集中技巧。这种训练通过特定的游戏和活动&#xff0c;帮助儿童培养注意力控制能力。首先&#xff0c;家长和教育者可以引导孩子参与简短且有趣的任务&am…...

VS2019下C++与MinIO实战:文件上传下载避坑指南(附编译包)

VS2019下C与MinIO深度集成&#xff1a;从环境配置到高效文件管理的完整实践 最近在重构一个企业级文件管理系统时&#xff0c;我面临将Java文件服务迁移到C的技术挑战。经过多轮技术选型&#xff0c;MinIO以其轻量级、高性能的特性成为理想选择。但在实际集成过程中&#xff0c…...

Phi-4-mini-reasoning自动化测试方案:生成测试数据与验证逻辑

Phi-4-mini-reasoning自动化测试方案&#xff1a;生成测试数据与验证逻辑 1. 引言&#xff1a;当AI遇上软件测试 最近跟几个测试团队聊天&#xff0c;发现他们都在为同样的事情头疼&#xff1a;手工编写测试用例耗时费力&#xff0c;边界条件覆盖不全&#xff0c;测试结果验证…...

linux中systemctl详细理解及常用命令解析

一、systemctl理解Linux 服务管理两种方式service和systemctlsystemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度&#xff0c;尽可能启动较少的进程&#xff0c;尽可能更多进程并发启动。systemd对应的进程管理命令是systemctl1. systemctl命令兼容了service即…...

Qwen3-TTS-12Hz-1.7B-Base语音克隆质量评测:与原声对比分析

Qwen3-TTS-12Hz-1.7B-Base语音克隆质量评测&#xff1a;与原声对比分析 1. 引言 语音克隆技术近年来发展迅猛&#xff0c;但真正能做到"以假乱真"的模型并不多见。Qwen3-TTS-12Hz-1.7B-Base作为阿里云最新开源的语音合成模型&#xff0c;号称仅需3秒音频就能克隆任…...

Pixel Couplet Gen 嵌入式设备部署探索:在边缘计算场景的应用

Pixel Couplet Gen 嵌入式设备部署探索&#xff1a;在边缘计算场景的应用 1. 边缘计算时代的轻量化AI需求 随着智能终端设备普及&#xff0c;越来越多的场景需要本地化AI能力。想象一下&#xff0c;春节期间走进一家智能家居体验店&#xff0c;门口的电子屏能实时为你生成个性…...

Nano-Banana企业级部署:支持API接入PLM系统,打通产品数据链路

Nano-Banana企业级部署&#xff1a;支持API接入PLM系统&#xff0c;打通产品数据链路 1. 引言&#xff1a;企业级部署的价值与意义 在现代制造业和设计行业中&#xff0c;产品数据管理一直是个令人头疼的问题。设计师创作的产品分解图、技术团队制作的结构示意图、营销部门需…...