SpringMVC 学习(九)之拦截器

目录

1 拦截器介绍

2 创建一个拦截器类

3 配置拦截器


1 拦截器介绍

        在 SpringMVC 中,拦截器 (Interceptor) 是一种用于拦截 HTTP 请求并在请求处理之前或之后执行自定义逻辑的组件。拦截器可以用于实现以下功能:

  • 权限验证:在请求处理之前进行用户身份验证和授权
  • 日志记录:记录请求的相关信息,如请求路径、参数、处理时间等
  • 异常处理:捕获并处理请求处理过程中抛出的异常
  • 性能监控:统计请求的响应时间、吞吐量等性能指标
  • 数据转换:在请求处理之前或之后对请求或响应的数据进行转换或修改
  • 缓存控制:在请求处理之前检查缓存,决定是否从缓存中获取数据

从以上功能可以看出,拦截器和过滤器作用很相似,但它们存在一些区别。

  • 层次结构:拦截器是 SpringMVC 框架特有的组件,不依赖 servlet 容器,过滤器是 Web 容器级别的组件,依赖 servlet 容器,可以应用于任何 Web 应用
  • 拦截范围:拦截器只能对 SpringMVC 的请求起作用,而过滤器则可以对几乎所有的请求起作用。拦截器可以获取 Spring 容器中的各个 bean,而过滤器就不行,在拦截器注入一个 service,可以调用业务逻辑
  • 触发时机:拦截器在 SpringMVC 的控制器方法被调用之前或之后触发,可以拦截并处理控制器方法的调用。过滤器在 HTTP 请求到达 Web 服务器之前或之后触发,可以在请求进入应用 (SpringMVC) 之前或响应返回给客户端之前进行处理
  • 调用顺序:过滤器在拦截器之前被调用,它们都可以按照 XML 文件中的配置顺序依次执行或注解 @Order 指定的顺序执行

2 创建一个拦截器类

        创建一个拦截器类需要实现 HandlerInterceptor 接口,该接口包括三个方法:preHandle、postHandle 和 afterCompletion。在这些方法中,可以编写拦截器的逻辑。

  • preHandle:控制器方法执行之前执行 preHandle(),其 boolean 类型的返回值表示是否拦截或放行,返回 true 表示放行,即调用控制器方法;返回 false 表示拦截,即不调用控制器方法
  • postHandle:控制器方法执行之后,渲染视图之前执行 postHandle()
  • afterComplation:处理完视图和模型数据,渲染视图完毕之后执行 afterComplation()
public class CustomInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 在处理器执行之前调用String userName=request.getParameter("userName");String password = request.getParameter("password");if (userName==null||password==null){response.setStatus(500);response.setContentType("text/html; charset=UTF-8");response.getWriter().print("参数缺失");return false;}//进行用户校验if (userName.equals("admin")&&password.equals("admin")){return true; // 返回true继续执行,返回false中断执行}else {response.setStatus(500);response.setContentType("text/html; charset=UTF-8");response.getWriter().print("用户名或密码错误");return false;}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 在处理器执行之后,返回ModelAndView之前调用}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 在整个请求处理完成后调用}
}

3 配置拦截器

基于注解

addPathPatterns 用于设置拦截哪些请求,excludePathPatterns 用于设置不拦截哪些请求

@Configuration
public class MvcConfig implements WebMvcConfigurer {@Autowiredprivate CustomInterceptor customInterceptor ;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(customInterceptor).addPathPatterns("/**").excludePathPatterns("/error");}
}

基于 XML

通过 <mvc:mapping> 设置需要拦截的请求,通过 <mvc:exclude-mapping> 设置需要排除的请求,即不需要拦截的请求
<mvc:interceptors><mvc:interceptor><!-- 拦截所有 URL --><mvc:mapping path="/**"/><!-- 不拦截 /testRequestEntity/ --><mvc:exclude-mapping path="/testRequestEntity"/><-- 拦截器类 --><bean class="com.example.CustomInterceptor" /></mvc:interceptor>
</mvc:interceptors>

注:对于多个拦截器,前面的拦截器不通过,即 preHandle() 返回 false,中断后续执行。

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

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

相关文章

SORA 到底是什么?如何用bitget wallet购买?

什么是SORA&#xff1f; SORA 是一种模因币&#xff0c;灵感来自 OpenAI 最新的人工智能模型 Sora&#xff0c;它巧妙地根据文本输入生成视频。 SORA 诞生于加密社区内人工智能项目的热潮中&#xff0c;利用 OpenAI 的公告推出了一种独特且时尚的数字资产。正如 memecoin 网站…

文件操作(IO技术,重要!!!)

1、文本文件和二进制文件 按文件中数据组织形式&#xff0c;我们把文件分为文本文件和二进制文件两大类&#xff0c; 1. 文本文件 文本文件存储的是普通“字符”文本&#xff0c;默认为unicode字符集&#xff08;两个字节表示一个字符&#xff0c;65535&#xff09;&#xff0c…

python|闲谈2048小游戏和数组的旋转及翻转和转置

目录 2048 生成数组 n阶方阵 方阵旋转 顺时针旋转 逆时针旋转 mxn矩阵 矩阵旋转 测试代码 测试结果 翻转和转置 2048 《2048》是一款比较流行​的数字游戏​&#xff0c;最早于2014年3月20日发行。原版2048由Gabriele Cirulli首先在GitHub上发布&#xff0c;后被移…

【MQ05】异常消息处理

异常消息处理 上节课我们已经学习到了消息的持久化和确认相关的内容。但是&#xff0c;光有这些还不行&#xff0c;如果我们的消费者出现问题了&#xff0c;无法确认&#xff0c;或者直接报错产生异常了&#xff0c;这些消息要怎么处理呢&#xff1f;直接丢弃&#xff1f;这就是…

浅谈 Linux 网络编程 - 网络字节序

文章目录 前言核心知识关于 小端法关于 大端法网络字节序的转换 函数 前言 在进行 socket 网络编程时&#xff0c;会用到字节流的转换函数、例如 inet_pton、htons 等&#xff0c;那么为什么要用到这些函数呢&#xff0c;本篇主要就是对这部分进行介绍。 核心知识 重点需要记…

韩国突发:将批准比特币ETF

作者&#xff1a;秦晋 韩国两党宣布将批准比特币ETF。比特币也再次成为竞选的宠儿。 4月10日&#xff0c;韩国将迎来每隔4年而进行的一次立法大选。在大选之前&#xff0c;现执政党与反对党都承诺将批准比特币ETF。 我们知道&#xff0c;比特币的主要受众群体以年轻人居多。此前…

idea打包报错,clean、package报错

一、idea在打包时&#xff0c;点击clean或package报错如下&#xff1a; Error running ie [clean]: No valid Maven installation found. Either set the home directory in the configuration dialog or set the M2_HOME environment variable on your system. 示例图&#xf…

揭示预处理中的秘密!(二)

目录 ​编辑 1. #运算符 2. ##运算符 3. 命名约定 4. #undef 5. 命令行定义 6. 条件编译 7. 头文件的被包含的方式 8.嵌套文件包含 9. 其他预处理指令 10. 完结散花 悟已往之不谏&#xff0c;知来者犹可追 …

androidapp开发语言,已获千赞

初级 初级研发工程师的定义是掌握基础的Android知识&#xff0c;能够独立完成一个功能&#xff0c;工作年限大概在1-2年&#xff0c;这个层级大部分人通过看一些资料书籍再经过项目练习很快可以达到。这个级别的人往往需要掌握如下一些技能&#xff1a; 掌握Android 四大组件…

Nginx网络服务六-----IP透传、调度算法和负载均衡

1.实现反向代理客户端 IP 透传 就是在日志里面加上一个变量 Module ngx_http_proxy_module [rootcentos8 ~]# cat /apps/nginx/conf/conf.d/pc.conf server { listen 80; server_name www.kgc.org; location / { index index.html index.php; root /data/nginx/html/p…

等保2.0高风险项全解析:判定标准与应对方法

引言 所谓高风险项&#xff0c;就是等保测评时可以一票否决的整改项&#xff0c;如果不改&#xff0c;无论你多少分都会被定为不合格。全文共58页&#xff0c;写得比较细了&#xff0c;但是想到大家基本不会有耐心去仔细看的&#xff08;凭直觉&#xff09;。这几天挑里边相对…

【大数据】Flink 内存管理(一):设置 Flink 进程内存

《Flink 内存管理》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 4 篇文章&#xff1a; Flink 内存管理&#xff08;一&#xff09;&#xff1a;设置 Flink 进程内存Flink 内存管理&#xff08;二&#xff09;&#xff1a;JobManager 内存分配&#xff08;含实际…

智慧校园|智慧校园管理小程序|基于微信小程序的智慧校园管理系统设计与实现(源码+数据库+文档)

智慧校园管理小程序目录 目录 基于微信小程序的智慧校园管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;学生信息管理 &#xff08;2&#xff09; 作业信息管理 &#xff08;3&#xff09;公告…

shader学习记录——融合、融球效果

融合、融球效果shader&#xff0c;重点在等势面公式上 Shader "Custom/MetaballsShader" {Properties{_MainTex ("Texture", 2D) "white" {}_Color("Color",Color) (1,1,1,1)}SubShader{Tags { "RenderType""Opaque…

什么是去中心化云计算?

去中心化云计算是一种新型的云计算方式&#xff0c;它与传统的中心化云计算不同&#xff0c;将数据和计算任务分布到多个节点上&#xff0c;而不是将数据集中存储在中心服务器上。这种云计算方式具有许多优势&#xff0c;包括提高数据安全性、降低运营成本、增强可扩展性和灵活…

【C语言】学生宿舍信息管理系统

目录 项目说明 1. 数据结构设计 2. 功能实现 3. 主菜单设计 4. 文件操作 5. 系统使用 项目展示 1.主菜单功能界面 ​编辑 2.添加信息 3.查询信息 4.修改信息 5.删除信息 6.退出程序 项目完整代码 结语 在这篇博客中&#xff0c;我们将探讨如何使用C语言来开发…

Java 反射机制

​ 更多内容&#xff0c;前往IT-BLOG ​ 反射Reflection被视为动态语言的关键&#xff0c;反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息&#xff0c;并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构…

通过QScrollArea寻找最后一个弹簧并且设置弹簧大小

项目原因&#xff0c;最近需要通过QScrollArea寻找其中最后一个弹簧并且设置大小和策略&#xff0c;因为无法直接调用UI指针&#xff0c;所以只能用代码寻找。 直接上代码&#xff1a; if (m_scrollArea){int iScrollWidth m_labelSelectedTitle->width();m_scrollArea-&g…

C语言--- 指针(3)

一.字符指针变量 在指针的类型中&#xff0c;我们知道有一种指针类型为字符指针char * 一般使用&#xff1a; #include<stdio.h> int main() {char ch a;char* p &ch;*p b;printf("%c\n",ch);return 0; } 其实还有一种使用方式 &#xff1a; #inc…

【前端素材】推荐优质后台管理系统Salreo平台模板(附源码)

一、需求分析 当我们从多个层次来详细分析后台管理系统时&#xff0c;可以将其功能和定义进一步细分&#xff0c;以便更好地理解其在不同方面的作用和实际运作。 1. 结构层次 在结构层次上&#xff0c;后台管理系统可以分为以下几个部分&#xff1a; a. 辅助功能模块&#…