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

相关推荐
考虑考虑7 分钟前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯1 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路5 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
像我这样帅的人丶你还8 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
plainGeekDev10 小时前
GreenDAO → Room
android·java·kotlin
亦暖筑序15 小时前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端
敲代码的彭于晏15 小时前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
plainGeekDev16 小时前
ButterKnife → ViewBinding
android·java·kotlin
像我这样帅的人丶你还1 天前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩1 天前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构