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大模型生成,注意识别!

相关推荐
letisgo519 分钟前
JAVA 高级进阶05篇《Spring容器机制:Bean生命周期与三级缓存全解》
java·spring·面试·ioc·源码分析
岁月如歌778620 分钟前
分布式锁完全指南:从数据库到 Redisson 的演进
java·后端·架构
AI深栈23 分钟前
第 8 章 · Tool Calling 与 Tool Search
java·人工智能
写后端的胖头鱼30 分钟前
【高频面试题】spring事物失效场景(带原理 + 代码示例)
java·后端·spring·事务·事物失效
小孩玩什么31 分钟前
深入理解字符串匹配算法:BF算法,KMP算法
java·c语言·开发语言·数据结构·c++·算法
长谷深风1111 小时前
Agent执行系统中的身份与版本设计
java·大数据·人工智能·ai·大模型·task·aiagent
Wang's Blog1 小时前
Java框架快速入门: Spring Security+OAuth2之UserDetails与JDBC认证实践
java·网络·spring
爱从未走散1 小时前
面试八股题
java·面试·职场和发展
艺杯羹1 小时前
AI编程时代软件工程怎么学:从底层思维认知到驱动智能体的架构跃迁
java·人工智能·ai·架构·软件工程·ai编程
土司大王1 小时前
LeetCode hot100——51.N 皇后:Java 回溯模板、列与对角线剪枝、O(n!) 复杂度分析
java·leetcode·剪枝