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

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

这篇学习笔记是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 {@Autowiredprivate ProjectInterceptor projectInterceptor;@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");}@Overrideprotected 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 {@Autowiredprivate ProjectInterceptor projectInterceptor;@Autowiredprivate ProjectInterceptor2 projectInterceptor2;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//配置多拦截器registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");}
}

相关文章:

  • ES6模块化
  • PyTorch中matmul函数使用详解和示例代码
  • 在 Oracle 中,创建不同类型索引的 SQL 语法
  • 行列式的性质
  • LuaJIT2.1 和 Lua5.4.8 性能对比
  • calico/node is not ready: BIRD is not ready: BGP not established with xxx
  • electron主进程和渲染进程之间的通信
  • JAVA开发工具——IntelliJ IDEA
  • HikariCP数据库连接池原理解析
  • 数字证书_CA_详解
  • 007-nlohmann/json 项目应用-C++开源库108杰
  • 使用Node.js分片上传大文件到阿里云OSS
  • Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
  • 「数据分析 - Pandas 函数」【数据分析全栈攻略:爬虫+处理+可视化+报告】
  • 2025年渗透测试面试题总结-腾讯[实习]玄武实验室-安全工程师(题目+回答)
  • Redis 缓存策略:借助缓存优化数据库性能并保障数据一致性
  • 【Redis】zset 类型
  • EasyRTC音视频实时通话助力新一代WebP2P视频物联网应用解决方案
  • 129、QT搭建FFmpeg环境
  • 「深度拆解」Spring Boot如何用DeepSeek重构MCP通信层?从线程模型到分布式推理的架构进化
  • 建设银行宁德分行网站/搜索引擎排名优化程序
  • 两女互舔互做日美网站/微信引流获客软件
  • wordpress 4.9.4 安装/信息流广告优化
  • 学做包子馒头的网站/聊城seo优化
  • 网站设计评价指标/在线生成个人网站免费
  • dw如何做网站界面/上海百度推广客服电话多少