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

发布于:2025-06-07 ⋅ 阅读:(14) ⋅ 点赞:(0)

这篇学习笔记是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/*");
    }
}