在 Spring Boot 项目中,WebMvcConfigurer
接口是开发者扩展和定制 Spring MVC 行为的核心工具。通过实现该接口并重写其方法,开发者可以灵活配置路由规则、拦截器、消息转换器、跨域策略等 MVC 相关功能。与直接继承 WebMvcConfigurationSupport
不同,WebMvcConfigurer
的设计更加友好,允许开发者按需覆盖默认配置而无需完全接管 MVC 配置,从而避免破坏 Spring Boot 的自动配置机制。
一、WebMvcConfigurer
的核心作用
1. 定制路由规则
通过重写 configurePathMatch
方法,开发者可以调整 URL 路径的匹配规则。例如:
• 统一添加 API 前缀:为不同模块的 Controller 动态添加公共前缀(如 /api/v1
)。
• 路径匹配策略:设置是否启用后缀匹配、尾斜杠忽略等。
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {configurer.addPathPrefix("/api", c -> c.isAnnotationPresent(RestController.class)).setUseTrailingSlashMatch(false); // 禁用尾斜杠匹配
}
2. 添加拦截器(Interceptor)
通过 addInterceptors
方法注册自定义拦截器,实现以下功能:
• 权限验证:检查用户登录状态或权限。
• 日志记录:记录请求耗时、参数等信息。
• 限流与防重放:防止重复请求或高频调用。
@Override
public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/api/**") // 拦截路径.excludePathPatterns("/api/login"); // 排除路径
}
3. 跨域请求配置(CORS)
通过 addCorsMappings
方法配置全局跨域规则,解决前端跨域问题:
@Override
public void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**") // 允许跨域的路径.allowedOrigins("https://example.com") // 允许的源.allowedMethods("GET", "POST"); // 允许的 HTTP 方法
}
4. 消息转换器(Message Converter)
通过 configureMessageConverters
方法定制 JSON、XML 等数据格式的序列化规则。例如:
• 替换默认的 Jackson 配置,设置日期格式。
• 添加 Protobuf 或自定义格式的支持。
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder().indentOutput(true).dateFormat(new SimpleDateFormat("yyyy-MM-dd"));converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
}
5. 视图控制与静态资源
通过 addViewControllers
和 addResourceHandlers
方法:
• 视图跳转:将特定 URL 映射到静态页面。
• 静态资源路径:自定义图片、CSS、JS 等资源的访问路径。
@Override
public void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/home").setViewName("home.html");
}@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
二、WebMvcConfigurer
的优势
1. 非侵入式扩展
• 通过实现接口的方式按需覆盖配置,无需继承 WebMvcConfigurationSupport
,保留 Spring Boot 的默认行为(如自动注册的 Converter
和 Formatter
)。
2. 模块化配置
• 允许多个配置类实现 WebMvcConfigurer
,每个类专注于单一职责(如安全配置、API 版本控制)。
3. 与自动配置兼容
• 在 Spring Boot 2.x 及以上版本中,优先使用 WebMvcConfigurer
而非已弃用的 WebMvcConfigurerAdapter
,确保与自动配置机制协同工作。
三、典型应用场景
1. 多版本 API 前缀管理
为不同版本的 API 添加统一前缀(如 /v1/user
、/v2/user
),避免 Controller 类中硬编码路径:
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {configurer.addPathPrefix("/v1", c -> c.getPackage().getName().contains(".v1."));
}
2. 全局异常处理
结合 @ControllerAdvice
定义统一异常处理逻辑,通过拦截器记录异常信息。
3. 微服务中的安全拦截
在网关或业务服务中,通过拦截器验证 JWT Token 或鉴权头信息。
四、实现注意事项
-
避免过度配置
仅覆盖需要修改的方法,保留其他默认行为。 -
配置类需被 Spring 管理
确保配置类被@Configuration
或@Component
注解标记。 -
多个配置类的执行顺序
使用@Order
注解控制多个WebMvcConfigurer
实现类的加载顺序。
五、总结
WebMvcConfigurer
是 Spring Boot 中定制 MVC 行为的“瑞士军刀”,它通过细粒度的配置方法,帮助开发者在不破坏默认机制的前提下,灵活扩展功能。无论是统一路由规则、增强安全拦截,还是优化数据传输格式,理解并熟练使用该接口,都能显著提升项目的可维护性和扩展性。