【SSM】SpringMVC学习笔记8:拦截器

news2025/6/7 5:00:03

这篇学习笔记是Spring系列笔记的第8篇,该笔记是笔者在学习黑马程序员SSM框架教程课程期间的笔记,供自己和他人参考。


Spring学习笔记目录

笔记1:【SSM】Spring基础: IoC配置学习笔记-CSDN博客 对应黑马课程P1~P20的内容。

笔记2: 【SSM】Spring学习笔记2:注解配置bean_ssm黑马笔记-CSDN博客 对应黑马课程P21~P27

笔记3: 【SSM】Spring学习笔记3:Spring整合MyBatis和Junit_spring整合mybaits-CSDN博客 对应黑马课程P28~30

笔记4:【SSM】Spring学习笔记4:Spring的AOP编程-CSDN博客 对应黑马课程P31~39

笔记5:【SSM】Spring学习笔记5:Spring事务-CSDN博客 对应黑马课程P40~42

笔记6: 【SSM】SpringMVC学习笔记6:SpringMVC入门-CSDN博客 对应黑马课程P43~58

笔记7: 【SSM】SpringMVC学习笔记7:前后端数据传输协议和异常处理-CSDN博客 对应黑马课程P59~65

笔记8:此篇 对应黑马课程P71~74

笔记9:【SSM】SpringBoot学习笔记1:SpringBoot快速入门-CSDN博客 对应黑马课程P90~101


1.是什么

SpringMVC提供的技术,用于在controller前后执行一些操作,包括可以在controller前拦截操作使程序不执行controller的功能。

2. 快速入门

2.1 声明拦截器的bean

这个类需要实现HandlerInterceptor接口。

该接口有三个方法可以重写,但不是必需要重写。

其中preHandle方法实在controller执行前执行的方法,如果该方法返回true,会放行访问controller;否则将不会访问controller,起到一个拦截的效果。

@Component
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {
    @Override
    //原始方法调用前执行的内容
    //返回值类型可以拦截控制的执行,true放行,false终止
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String contentType = request.getHeader("Content-Type");
        HandlerMethod hm = (HandlerMethod)handler;
        System.out.println("preHandle..."+contentType);
        return true;
    }

    @Override
    //原始方法调用后执行的内容
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle...");
    }

    @Override
    //原始方法调用完成后执行的内容
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion...");
    }
}

2.2 定义配置类

在该配置类中进行拦截器配置,配置在哪些controller上使用哪些拦截器。

需要继承WebMvcConfigurationSupport(笔记6中对静态界面的放行也是通过这个类来配置),实现addInterceptors方法。自己定义好的拦截器需要注入。

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Autowired
    private ProjectInterceptor projectInterceptor;

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
    }

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        //配置拦截器
        //  “/books/*”里使用“*”通配符
        registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
    }
}

该配置类需要被SpringMVC的核心配置类(用于初始化SpringMVC容器的类)扫描到(通过@ComponentScan注解)

@Configuration
@ComponentScan({"com.itheima.controller","com.itheima.config"})
@EnableWebMvc
public class SpringMvcConfig {
    
}

2.3 执行流程

3. 拦截器的参数

如下图拦截器的这些参数使可以使用的。

【豆包】

1. HttpServletRequest request
  • 作用:封装客户端的 HTTP 请求信息,如请求参数、请求头、Cookies 等。
  • 常用方法
    • request.getParameter("name"):获取请求参数。
    • request.getHeader("User-Agent"):获取请求头。
    • request.getSession():获取用户会话。
  • 使用场景:在postHandle中,可以读取请求信息用于日志记录或权限验证。
2. HttpServletResponse response
  • 作用:封装服务器的 HTTP 响应信息,可用于设置响应头、状态码或直接输出内容。
  • 常用方法
    • response.setStatus(200):设置 HTTP 状态码。
    • response.setContentType("application/json"):设置响应类型。
    • response.getWriter().write("Custom Response"):直接输出内容。
  • 使用场景:在postHandle中,可以修改响应头(如添加 CORS 信息)或提前终止响应。
3. Object handler(树树:涉及反射机制)
  • 作用:当前请求执行的处理器对象。在 Spring MVC 中,通常是一个HandlerMethod(即 Controller 中的方法)。
  • 常用操作
    • 判断处理器类型:if (handler instanceof HandlerMethod)
    • 获取方法信息:HandlerMethod handlerMethod = (HandlerMethod) handler;
    • 获取方法注解:handlerMethod.getMethod().getAnnotation(MyAnnotation.class)
  • 使用场景:根据不同的处理器或方法注解执行不同的逻辑(如仅对特定接口进行拦截)。
4. ModelAndView modelAndView
  • 作用:封装处理器返回的模型数据和视图信息(仅当处理器返回ModelAndView时有效)。
  • 常用操作
    • 修改模型数据:modelAndView.addObject("key", "value");
    • 更改视图:modelAndView.setViewName("newView");
    • 判断是否有视图:if (modelAndView != null)
  • 使用场景:在响应返回前,动态添加额外数据(如全局变量)或修改视图路径。
5.Exception ex 参数的作用
  • 作用:封装处理器(Controller 方法)执行过程中抛出的未被捕获的异常
  • 注意事项
    • 仅当请求处理过程中发生异常时ex 才不为 null
    • 如果请求正常完成(无异常),ex 为 null

4. 拦截器链

对同一个controller配置多个拦截器就会形成拦截器链

如下面对访问/books、/books/的控制器添加两个拦截器,将会以以下顺序执行

  1. projectInterceptor.preHandle
  2. ->projectInterceptor2.preHandle
  3. ->projectInterceptor2.postHandle
  4. ->projectInterceptor.postHandle
  5. ->projectInterceptor2.afterCompletion
  6. ->projectInterceptor.afterCompletion
@Configuration
@ComponentScan({"com.itheima.controller"})
@EnableWebMvc
//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {
    @Autowired
    private ProjectInterceptor projectInterceptor;
    @Autowired
    private ProjectInterceptor2 projectInterceptor2;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //配置多拦截器
        registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
        registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

井川里予瓜pdf完整版

井川里予瓜pdf完整版 下载链接: 链接:https://pan.quark.cn/s/c75455d6be60 在网红文化盛行的当下,井川里予无疑是一位备受瞩目的人物。这位2001年出生于广东湛江的姑娘,凭借独特风格在网络世界掀起波澜,其发展轨迹…

基于 Zynq 平台的 EtherCAT 主站的软硬件协同设计

摘要: 针对工业自动化对控制能力和强实时性的需求,提出了一种基于 FPGA 的改进型 EtherCAT 硬件主站方案 。 该方案利用 Zynq-7000 平台,在 PL 端实现 FPGA 协议栈,以保证核心功能的高效执 行 。 基于 AXI4 总线设计…

聊一聊 .NET在Linux下的IO多路复用select和epoll

一:背景 1. 讲故事 在windows平台上,相信很多人都知道.NET异步机制是借助了Windows自带的 IO完成端口 实现的异步交互,那在 Linux 下.NET 又是怎么玩的呢?主要还是传统的 select,poll,epoll 的IO多路复用…

从零开始的嵌入式学习day33

网络编程及相关概念 UDP网络通信程序 UDP网络通信操作 一、网络编程及相关概念 1. 网络编程概念: 指通过计算机网络实现程序间通信的技术,涉及协议、套接字、数据传输等核心概念。常见的应用场景包括客户端-服务器模型、分布式系统、实时通信等。…

黑马Java面试笔记之框架篇(Spring、SpringMvc、Springboot)

一. 单例bean Spring框架中的单例bean是线程安全的吗? Spring框架中的bean是单例的,可以在注解Scope()进行设置 singleton:bean在每一个Spring IOC容器中只有一个实例。prototype:一个bean的定义可以有多个实例 总结 二. AOP AOP称…

全球IP归属地查询接口如何用C#进行调用?

一、什么是全球IP归属地查询接口 在全球化互联网时代,IP地址作为网络世界的地理位置标识,扮演着至关重要的角色。全球IP归属地查询接口通过解析IP地址,提供包括国家、省、市、区县和运营商在内的详细信息。 二、应用场景 1. 访问识别 全球…

NumPy 比较、掩码与布尔逻辑

文章目录 比较、掩码与布尔逻辑示例:统计下雨天数作为通用函数(Ufuncs)的比较运算符使用布尔数组计数条目布尔运算符 布尔数组作为掩码使用关键字 and/or 与运算符 &/| 的区别 比较、掩码与布尔逻辑 本文介绍如何使用布尔掩码来检查和操…

力扣HOT100之二分查找:35. 搜索插入位置

这道题属于是二分查找的入门题了,我依稀记得一些二分查找的编码要点,但是最后还是写出了一个死循环,无语(ˉ▽ˉ;)…又回去看了下自己当时的博客和卡哥的视频,这才发现自己分情况只分了两种,最后导致死循环…

使用API有效率地管理Dynadot域名,查看域名市场中所售域名的详细信息

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…

IM即时通讯软件,构建企业局域网内安全协作

安全与权限:协同办公的企业级保障 在协同办公场景中,BeeWorks 将安全机制贯穿全流程。文件在局域网内传输与存储时均采用加密处理,企业网盘支持水印预览、离线文档权限回收等功能,防止敏感资料外泄;多人在线编辑文档时…

VueScan:全能扫描,高清输出

在数字化办公和图像处理的领域,扫描仪扮演着不可或缺的角色。无论是文档的数字化存档、照片的高清复制,还是创意项目的素材采集,一款性能卓越、操作便捷的扫描软件能大幅提升工作效率和成果质量。VueScan正是这样一款集多功能于一身的扫描仪软…

PyCharm项目和文件运行时使用conda环境的教程

打开【文件】—【新建项目】 按照下图配置环境 可以看到我这个项目里,报错“No module named modelscope” 点击终端,输入命令 #显示所有的conda环境 conda env list #选择需要激活的conda环境 conda activate XXX在终端中,执行pip install …

DeepSwiftSeek 开源软件 |用于 DeepSeek LLM 模型的 Swift 客户端 |轻量级和高效的 DeepSeek 核心功能通信

​一、软件介绍 文末提供程序和源码下载 DeepSeek Swift SDK 是一个轻量级且高效的基于 Swift 的客户端,用于与 DeepSeek API 进行交互。它支持聊天消息完成、流式处理、错误处理以及使用高级参数配置 DeepSeekLLM。 二、Features 特征 Supports chat completion …

Flask-Login使用示例

项目结构 首先创建以下文件结构: flask_login_use/ ├── app.py ├── models.py ├── requirements.txt └── templates/├── base.html├── index.html├── login.html├── register.html└── profile.html1. requirements.txt Flask2.3.3 Fl…

web第九次课后作业--SpringBoot基于mybatis实现对数据库的操作

前言 在前面我们学习MySQL数据库时,都是利用图形化客户端工具(如:idea、datagrip),来操作数据库的。 在客户端工具中,编写增删改查的SQL语句,发给MySQL数据库管理系统,由数据库管理系统执行SQL语句并返回执…

wordpress免费主题网站

这是一款WordPress主题,由jianzhanpress开发,可以免费下载。专为中小微企业设计,提供专业的网站建设、网站运营维护、网站托管和网站优化等服务。主题设计简约、现代,适合多种行业需求。 主要特点: 多样化展示&#…

Go中的协程并发和并发panic处理

1 协程基础 1.1 协程定义(Goroutine) 概念:Go 语言特有的轻量级线程,由 Go 运行时(runtime)管理,相比系统线程(Thread),创建和销毁成本极低,占用…

Qt Creator工具编译器配置

1、打开Qt Creator,工具-->选项 2、选择"编译器",Manual配置编译器。 初始化填入“C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\cl.exe”,选择64位amd64。 ABI根据msvc版本进行选择msvc2015. 3、新建项目…

Spring框架学习day7--SpringWeb学习(概念与搭建配置)

SpringWeb1.SpringWeb特点2.SpringWeb运行流程3.SpringWeb组件4.搭建项目结构图:4.1导入jar包4.2在Web.xml配置**4.2.1配置统一拦截分发器 DispatcherServlet**4.2.2开启SpringWeb注解(spring.xml) 5.处理类的搭建6.SpringWeb请求流程(自己理…

打造高效多模态RAG系统:原理与评测方法详解

引言 随着信息检索与生成式AI的深度融合,检索增强生成(RAG, Retrieval-Augmented Generation) 已成为AI领域的重要技术方向。传统RAG系统主要依赖文本数据,但真实世界中的信息往往包含图像、表格等多模态内容。多模态RAG&#xf…