【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,起到一个拦截的效果。

java 复制代码
@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方法。自己定义好的拦截器需要注入。

java 复制代码
@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注解)

java 复制代码
@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
    • 如果请求正常完成(无异常),exnull

4. 拦截器链

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

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

  1. projectInterceptor.preHandle
  2. ->projectInterceptor2.preHandle
  3. ->projectInterceptor2.postHandle
  4. ->projectInterceptor.postHandle
  5. ->projectInterceptor2.afterCompletion
  6. ->projectInterceptor.afterCompletion
java 复制代码
@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/*");
    }
}
相关推荐
Kali_076 分钟前
使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】
java·人工智能·免费
rzl0218 分钟前
java web5(黑马)
java·开发语言·前端
jingling55530 分钟前
面试版-前端开发核心知识
开发语言·前端·javascript·vue.js·面试·前端框架
guojl37 分钟前
深度解读jdk8 HashMap设计与源码
java
guojl43 分钟前
深度解读jdk8 ConcurrentHashMap设计与源码
java
m0_687399841 小时前
写一个Ununtu C++ 程序,调用ffmpeg API, 来判断一个数字电影的视频文件mxf 是不是Jpeg2000?
开发语言·c++·ffmpeg
爱上语文1 小时前
Redis基础(5):Redis的Java客户端
java·开发语言·数据库·redis·后端
A~taoker1 小时前
taoker的项目维护(ng服务器)
java·开发语言
萧曵 丶1 小时前
Rust 中的返回类型
开发语言·后端·rust
HGW6891 小时前
基于 Elasticsearch 实现地图点聚合
java·elasticsearch·高德地图