Spring MVC拦截器

一、什么是拦截器

拦截器是 SpringMVC 提供的一种可以在请求处理过程中对请求进行预处理或后处理的机制。简单来说,拦截器就像是一位“守门员”,它拦住所有进来的请求,根据设定的规则决定是否放行或者进行某些操作。

拦截器可以:

  • 在请求进入 Controller 之前做一些操作(如权限检查、日志记录、性能监控等)。
  • 在请求返回前做一些操作(如对返回数据进行修改、记录日志等)。

二、拦截器和过滤器的区别

拦截器与过滤器(Filter)有许多相似之处,它们都可以对 HTTP 请求和响应进行拦截和处理。但是,它们的工作原理和应用场景有所不同。

特性

拦截器 (Interceptor)

过滤器 (Filter)

生命周期

只在 SpringMVC 生命周期内起作用

可以跨多个应用,通常与 Servlet 容器相关

适用范围

只适用于 SpringMVC 控制器的请求处理过程

可以处理所有类型的请求和响应

执行时机

在 Controller 方法调用之前和之后

在请求到达 Servlet 之前和响应返回之前

是否能够访问 SpringMVC 的功能

可以访问 SpringMVC 提供的各种功能

不能直接访问 SpringMVC 的功能

配置方式

配置在 Spring 配置文件中

配置在 web.xml 文件中

拦截器更贴近 SpringMVC 的请求处理机制,能与 Spring 提供的功能更加紧密地集成,而过滤器更多的是一种通用的 Web 组件,适用于不同类型的 Web 应用。

过滤器依赖于servlet,而拦截器技术属于SpringMVC

过滤器可对所有请求起作用,拦截器只对访问controller层的请求起作用。

过滤器会比拦截器先执行。拦截器(Interceptor)是在Servlet和Controller控制器之间执行;而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行。

 

三、拦截器的工作时机

1、三个阶段

预处理阶段:在请求到达 Controller 之前,拦截器的 preHandle() 方法会被执行。

后处理阶段:在 Controller 方法执行后,视图渲染之前,拦截器的 postHandle() 方法会被调用。

最终处理阶段:无论请求成功与否,拦截器的 afterCompletion() 方法都会在请求结束时执行。

2、三个常用方法

都在接口HandlerInterceptor中声明。

1.preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

在 Controller 方法执行之前调用。返回值是 boolean 类型,true 表示继续执行,false 表示请求被中止,后续的拦截器和 Controller 不会执行。

2. postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

在 Controller 方法执行后,视图渲染前调用。可以对 ModelAndView 进行修改。

3. afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

在请求处理完成后(视图渲染后)调用,用于清理资源。

 

3、多个拦截器执行

1. 请求进入多个拦截器的 preHandle() 方法

请求会按照拦截器的配置顺序进入每个拦截器的 preHandle() 方法。

如果某个拦截器的 preHandle() 返回 false,那么请求会被中断,后续的拦截器和 Controller 方法都不会被执行。

2. 请求进入 Controller

如果所有拦截器的 preHandle() 都返回 true,请求会最终进入 Controller 的目标方法。

3. 多个拦截器的 postHandle() 方法

当 Controller 方法执行完毕后,拦截器的 postHandle() 方法会按配置顺序从后往前被调用。即,最后配置的拦截器的 postHandle() 会最先执行。

postHandle() 方法中的 ModelAndView 还没有被渲染,可以对它进行修改。

4. 多个拦截器的 afterCompletion() 方法

最后,拦截器的 afterCompletion() 方法会按配置顺序从前往后被调用,即,第一个配置的拦截器的 afterCompletion() 会最先执行。这个方法通常用于清理工作,比如日志记录或释放资源。

4、单个拦截器和多个拦截器执行顺序对比

阶段

单个拦截器执行顺序

多个拦截器执行顺序

preHandle()

按顺序执行,遇到

false

中断请求

按顺序执行,遇到

false

中断请求

Controller

执行 Controller 方法

执行 Controller 方法

postHandle()

按顺序执行(如果有多个拦截器,从前到后)

按配置顺序反向执行(从最后一个拦截器到第一个)

afterCompletion()

按顺序执行(从前到后)

按配置顺序正向执行(从第一个拦截器到最后一个)

四、单个拦截器示例

1、创建拦截器

package com.goose.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")){return true;}else{// 判断是否登录过if(request.getSession().getAttribute("user")!=null){return true;}else{// 重定向到login页面response.sendRedirect("/html/login.html");return false;}}}
}

2、配置拦截器

<!-- 配置拦截器 -->
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/> <!--表示拦截所有请求--><bean class="com.goose.config.LoginInterceptor" ></bean></mvc:interceptor>
</mvc:interceptors>

3、在Controller 中处理登录

package com.goose.controller;import org.springframework.stereotype.Controller;
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")public String login(String username, String password, HttpSession session){if(username.equals("张三") && password.equals("123")){System.out.println("用户登录成功");session.setAttribute("user","张三");return "A";}return "B";}
}

html界面略

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

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

相关文章

mysql语句 聚合+分组+内外链接

1.聚合函数 1.count 记数 2.sum 求和 3.avg *语法&#xff1a;select avg&#xff08;列名&#xff09; from 表名&#xff1b; 4.max 求最大值 5.min 求最小值 求一个班级数学平均分&#xff1f; select avg&#xff08;ifnull&#xff08;math&#xff0c;0&#x…

WPF 与 C# 融合开发:从基础到高级应用(一)

WPF 与 C# 融合开发&#xff1a;从基础到高级应用 一、C# 语言基础回顾 1.1 C# 语言概述 C# 是微软开发的一种现代、面向对象的编程语言&#xff0c;它融合了 C、C 和 Java 等语言的优点&#xff0c;具有简洁、安全、高效等特点。C# 广泛应用于 Windows 平台的应用开发&…

【Linux】IP协议

目录 一、IP协议的概念 二、IP协议的报头 &#xff08;一&#xff09;IP协议报文的封装、解包和分用 &#xff08;二&#xff09;8位生存时间 &#xff08;三&#xff09;IP分片 三、IP协议的网段划分 &#xff08;一&#xff09;为什么需要网段划分 &#xff08;二&am…

如何快速下载并安装 Postman?

从下载、安装、启动 Postman 这三个方面为大家详细讲解下载安装 Postman 每一步操作&#xff0c;帮助初学者快速上手。 Postman 下载及安装教程(2025最新)

计算机网络高频(三)UDP基础

计算机网络高频(三)UDP基础 1.UDP的头部格式是什么样的?⭐ UDP 头部具有以下字段: 源端口(Source Port):16 位字段,表示发送方的端口号。目标端口(Destination Port):16 位字段,表示接收方的端口号。长度(Length):16 位字段,表示 UDP 数据报(包括头部和数据部…

2024年MathorCup数学建模B题甲骨文智能识别中原始拓片单字自动分割与识别研究解题全过程文档加程序

2024年第十四届MathorCup高校数学建模挑战赛 B题 甲骨文智能识别中原始拓片单字自动分割与识别研究 原题再现&#xff1a; 甲骨文是我国目前已知的最早成熟的文字系统&#xff0c;它是一种刻在龟甲或兽骨上的古老文字。甲骨文具有极其重要的研究价值&#xff0c;不仅对中国文…

【深度学习的数学】导数

导数的定义。好像是从极限开始的。比如说&#xff0c;函数f(x)在点xa处的导数&#xff0c;就是当h趋近于0时&#xff0c;[f(ah) - f(a)]除以h的极限&#xff0c;对吧&#xff1f;公式应该是这样的&#xff1a;f’(a) lim_{h→0} [f(ah) - f(a)] / h。这个极限如果存在的话&…

word文件转换为Markdown格式

目录 一、前言1.1、poi-ooxml、docx4j、aspose-words对比二、poi-ooxml技术实现一、前言 顺应时代技术的变更及高效协同理念的影响,非结构化信息展示、存储、应用等也由传统文档向在线协同文档的演变,类似腾讯在线文档。   目前大多数在线文档支持的是Markdown格式,因此这…

【Hugging Face 开源库】Diffusers 库 —— 扩散模型

Diffusers 的三个主要组件1. DiffusionPipeline&#xff1a;端到端推理工具__call__ 函数callback_on_step_end 管道回调函数 2. 预训练模型架构和模块UNetVAE&#xff08;Variational AutoEncoder&#xff09;图像尺寸与 UNet 和 VAE 的关系EMA&#xff08;Exponential Moving…

langserve搭建方法

文章目录 安装 langserver安装 langchain-cli创建langserve脚手架使用poetry管理包 安装 langserver pip install langserve安装 langchain-cli pip install langchain-cli创建langserve脚手架 langchain app new 项目名后续交互界面全回车&#xff0c;接着cd到 项目名 目录…

网络基础-路由器和交换机工作配置

三、路由器和交换机的工作原理配置以及华为体系下的小型网络的搭建 3.1路由基础 3.1.1数据转发 通过链路层交换机和网络层路由器进行数据转发 交换机&#xff08;链路层&#xff09;mac地址表的数据转发路由器&#xff08;网络层&#xff09; ip路由表的数据转发 隔离广播域…

mysql高级,mysql体系结构,mysql引擎,存储过程,索引,锁

1.mysql体系结构 1&#xff09; 连接层 主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念&#xff0c;为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作…

Unity高清渲染管线

Unity高清渲染管线——1 unity高清渲染管线是渲染管线的一种&#xff0c;在看完《创造高清3D虚拟世界》这本书的前两章以及第三张第二小节后终于对unity的高清渲染管线也是有了一个初步的认知&#xff0c;以下是我个人理解仅作参考&#xff1a; unity高清渲染管线项目模板比起…

Python基础语法元素(学习笔记)

实例1&#xff1a;温度转换 # TempConvert.py #为单行注释 多行注释为: 这里写内容 TempStr input("请输入带有符号的温度值&#xff1a;") if TempStr[-1] in [F,f] :C (eval(TempStr[0:-1])-32)/1.8print("转换后的温度是{:.2f}C".format(C)) e…

C++20 中的std::c8rtomb和 std::mbrtoc8

文章目录 1. 引言2. std::c8rtomb 函数详解3. std::mbrtoc8 函数详解4. 使用示例5. 注意事项6. 总结 1. 引言 C20 标准引入了对 UTF-8 编码的更好支持&#xff0c;其中包括两个重要的函数&#xff1a;std::c8rtomb 和 std::mbrtoc8。这两个函数分别用于将 UTF-8 编码的字符转换…

数据可视化TensorboardX和tensorBoard安装及使用

tensorBoard 和TensorboardX 安装及使用指南 tensorBoard 和 TensorBoardX 是用于可视化机器学习实验和模型训练过程的工具。TensorBoard 是 TensorFlow 官方提供的可视化工具&#xff0c;而 TensorBoardX 是其社区驱动的替代品&#xff0c;支持 PyTorch 等其他框架。以下是它…

flutter-实现瀑布流布局及下拉刷新上拉加载更多

文章目录 1. 效果预览2. 结构分析3. 完整代码4. 总结 1. 效果预览 在 Flutter 应用开发中&#xff0c;瀑布流布局常用于展示图片、商品列表等需要以不规则但整齐排列的内容。同时&#xff0c;下拉刷新和上拉加载更多功能&#xff0c;能够极大提升用户体验&#xff0c;让用户方…

【day2】数据结构刷题 栈

一 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的…

YAML是什么?

YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种以数据为中心、高度可读的序列化语言&#xff0c;广泛应用于配置文件、数据交换和自动化工具中。以下从多个维度对其进行全面解析&#xff1a; 1. 定义与历史演变 全称与定位&#xff1a; YAML的全称最初为“Yet…

熔断降级(Sentinel解决)

问题概述 在微服务架构中一定要预防微服务雪崩问题&#xff0c;微服务雪崩问题就是指在微服务架构中&#xff0c;当一个服务出现故障时&#xff0c;由于服务之间的依赖关系&#xff0c;故障可能会传播到其他服务&#xff0c;从而导致了大规模的服务失败&#xff0c;系统无法正…