Java Spring MVC 中 WebMvcConfigurer 和 HandlerInterceptor之间的关系和用法案例

在Spring MVC中,WebMvcConfigurer 和 HandlerInterceptor 是两个重要的组件,它们分别承担不同的职责。

WebMvcConfigurer 接口

WebMvcConfigurer 是一个配置接口,允许我们自定义Spring MVC的各种功能:

  • 配置拦截器注册
  • 添加资源处理器
  • 配置视图控制器
  • 配置跨域请求等

通常我们会实现这个接口或者继承其适配器类来定制MVC配置。

HandlerInterceptor 拦截器

HandlerInterceptor 是Spring MVC中的拦截器接口,可以在请求处理的不同阶段执行自定义逻辑:

  • preHandle 在控制器方法执行前调用
  • postHandle: 在控制器方法执行后、视图渲染前调用

示例代码

java 复制代码
// 自定义拦截器
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CustomInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, 
                           HttpServletResponse response, 
                           Object handler) throws Exception {
        System.out.println("Pre Handle method is Calling");
        // 可以在这里做权限验证、日志记录等操作
        return true; // 返回true继续执行,返回false中断执行
    }
    
    @Override
    public void postHandle(HttpServletRequest request, 
                         HttpServletResponse response, 
                         Object handler, 
                         ModelAndView modelAndView) throws Exception {
        System.out.println("Post Handle method is Calling");
        // 可以在这里对model数据进行修改
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, 
                              HttpServletResponse response, 
                              Object handler, 
                              Exception exception) throws Exception {
        System.out.println("Request and Response is completed");
        // 可以在这里做资源清理工作
    }
}
java 复制代码
// WebMvcConfigurer配置类
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册自定义拦截器并指定路径模式
        registry.addInterceptor(new CustomInterceptor())
                .addPathPatterns("/api/**")           // 拦截/api开头的所有请求
                .excludePathPatterns("/api/public/**"); // 排除/api/public开头的请求
    }
    
    // 其他常用配置示例
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .maxAge(3600);
    }
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
    }
}

两者之间的依赖关系

  1. 配置与实现的关系:

    • WebMvcConfigurer 负责配置和注册各种MVC组件
    • HandlerInterceptor 是具体的业务实现组件
  2. 生命周期关系:

    • WebMvcConfigurer 在应用启动时被Spring容器加载
    • HandlerInterceptor 在每次HTTP请求处理过程中被调用
  3. 依赖注入:

    • 通过 WebMvcConfigurer 的 addInterceptors() 方法注册 HandlerInterceptor
    • 多个拦截器可以通过 WebMvcConfigurer 进行统一管理和配置

这种设计体现了Spring框架"配置与实现分离"的设计理念,使得系统更加灵活且易于维护。

以上内容由AI大模型生成,注意识别!

相关推荐
泡茶喝茶写代码3 小时前
A股量化数据工程:从 REST 接口到策略信号(第 1 篇):指数列表与实时行情接入
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据接口
Sarvartha3 小时前
接口基础知识
java·开发语言
不才不才不不才3 小时前
Spring 源码系列(29): 20 道高频面试题源码级解析合集
java·后端·spring
索隆zoro3 小时前
Army 的可插拔架构:army-jdbc 与方言模块
java·后端
小蒜学长4 小时前
校园社团招新网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·校园社团招新网站
Dovis(誓平步青云)4 小时前
多个链接不等于多份证据,新闻核验看板怎样合并来源
java·服务器·前端·javascript·人工智能·pdf·电脑
旺仔Sec5 小时前
2026年江西省职业院校技能大赛(中职组)应用软件系统开发赛项竞赛样题
java·应用软件系统开发
Dovis(誓平步青云)5 小时前
几个方案来回选不定?做一个随时切换的候选推荐页
android·java·服务器·开发语言·javascript·数据库·智能化
一条破秋裤5 小时前
Linux 线程同步:读写锁
java·linux·jvm
蜗牛互联网5 小时前
从Barclays扩大Claude部署看受监管软件工程的责任重分配
java·大数据·人工智能·后端·软件工程