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

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

WebMvcConfigurer 接口

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

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

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

HandlerInterceptor 拦截器

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

  • preHandle\] 在控制器方法执行前调用

示例代码

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

相关推荐
心之语歌1 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊2 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang2 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
用户8307196840822 小时前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Ray Liang4 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解4 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
SimonKing8 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean8 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven979 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java
皮皮林55119 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java