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

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

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. 依赖注入

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

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

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

相关推荐
long31632 分钟前
封装(Encapsulation)
java·人工智能·ai·ai编程
yaoxin52112333 分钟前
502. Java 反射 - 编写 MessageInterceptor 类
java·开发语言
风流 少年37 分钟前
Spring AI 2.0:阿里云百炼平台(工作流应用)
java·后端·spring
长谷深风11143 分钟前
AI Tool 设计:粒度、参数与错误恢复怎么做
java·大数据·人工智能·ai agent·agent工作流·智能体设计·ai产品设计
QQ_21696290962 小时前
【项目编号:project95315】SpringBoot公共自习室管理系统:座位预约、房间管理、签到核销、公告规则完整实战
java·spring boot·后端
手握风云-2 小时前
Spring Cloud:分布式系统的“粘合剂”(五)
后端·spring·spring cloud
嵌入式阿蔡2 小时前
面试高频考点 01:volatile / 中断 / 堆栈 八股精讲
java·面试·职场和发展·嵌入式实时数据库
秋饼2 小时前
LangChain4j + Java 实现企业级 Text-to-SQL 智能问数系统:从自然语言到安全可控的数据洞察
java·ai·技术分享·后端开发
Escalating_xu3 小时前
【C++ STL简介】从六大组件到容器、迭代器与算法协作
java·c++·算法
何以解忧,唯有..3 小时前
Python os模块详解:文件与目录操作指南
java·服务器·python