SpringBoot - WebMvcConfigurer的作用是什么?

本文介绍SpringMVC的配置方式,包括使用WebMvcConfigurer接口进行全局配置,具体涉及路径匹配规则、静态资源处理、跨域设置等内容。

写在前面

WebMvcConfigurer是一个接口,用于配置全局的SpringMVC的相关属性,采用JAVABEAN的方式来代替传统的XML配置文件,提供了跨域设置、静态资源处理器、类型转化器、自定义拦截器、页面跳转等能力。
WebMvcConfigurer 在 Spring Boot 2.x 中官方建议使用该接口来实现自定义配置。所以,Spring Boot 2.x 中,自定义 SpringMVC 配置可以通过实现 WebMvcConfigurer 接口来完成。

源码说明

public interface WebMvcConfigurer {
   
   
	//  配置路径匹配规则
    default void configurePathMatch(PathMatchConfigurer configurer) {
   
    }

	// 内容协商
    default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
   
    }
	
	// 异步调用支持
    default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
   
    }

	// 静态资源默认处理器
    default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
   
    }

	// 格式化器, 可以把时间转化成你需要时区或者格式,还可以将对象A转换为对象B。
    default void addFormatters(FormatterRegistry registry) {
   
    }

	// 请求拦截器
    default void addInterceptors(InterceptorRegistry registry) {
   
    }

	// 静态资源映射器
    default void addResourceHandlers(ResourceHandlerRegistry registry) {
   
    }

	// 跨域设置
    default void addCorsMappings(CorsRegistry registry) {
   
    }

	// 视图控制器
    default void addViewControllers(ViewControllerRegistry registry) {
   
    }

	// 视图解析器
    default void configureViewResolvers(ViewResolverRegistry registry) {
   
    }

	// 参数处理器
    default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
   
    }

	// 返回值处理器
    default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
   
    }

	// 信息转化器
    default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
   
    }

	// 信息转化器扩展
    default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
   
    }

	// 异常处理器
    default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
   
    }

	// 异常处理器扩展
    default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver
### ### Spring Boot 拦截器的基本概念 Spring Boot 拦截器是一种用于在 HTTP 请求处理过程中插入自定义逻辑的机制。它允许开发者在请求进入业务逻辑处理之前、之后以及整个请求完成时执行特定操作。拦截器通常用于实现身份验证、日志记录、性能监测等功能,与过滤器(Filter)不同,拦截器更贴近 MVC 层,能够访问 Controller 的上下文信息[^1]。 ### ### 拦截器的生命周期阶段 Spring Boot 拦截器可以在多个生命周期阶段介入请求处理流程: 1. **请求处理前(preHandle)** 在请求进入 Controller 之前执行,可以对请求进行预处理,例如设置请求头、验证用户身份、记录请求日志等。此方法返回一个布尔值,若返回 `false`,则中断请求处理流程[^1]。 2. **请求处理后(postHandle)** 在 Controller 处理完成后、视图渲染之前执行。可以访问 Controller 返回的 `ModelAndView` 对象,用于修改模型数据或添加响应头。此方法无法访问响应体内容,因此不适用于 RESTful 接口的后处理[^1]。 3. **请求完成后(afterCompletion)** 在整个请求完成之后执行,无论是否发生异常。适合用于资源清理、性能统计、异常记录等操作。此方法在 `postHandle` 之后执行,即使 Controller 抛出异常,也会保证执行。 ### ### 拦截器与过滤器的区别 拦截器与过滤器的主要区别在于作用层级和功能定位: - **作用层级**: 过滤器作用于更底层的 Servlet 层,适用于处理跨应用的通用行为,如编码设置、请求日志记录等。 拦截器作用Spring MVC 层,能够访问 Controller 的信息,适用于与业务逻辑紧密相关的操作,如权限控制、参数校验等。 - **执行顺序**: 多个拦截器按照配置顺序依次执行 `preHandle`,而在 `postHandle` 和 `afterCompletion` 阶段则按照逆序执行。这种机制确保了拦截器的逻辑可以按预期嵌套执行[^2]。 ### ### 拦截器的使用场景 常见的使用场景包括: - **身份验证和授权**:在请求进入业务逻辑前验证用户身份,如检查 Token 或 Session。 - **日志记录**:记录请求的 URL、参数、响应时间等信息,用于调试或监控。 - **性能监测**:统计请求处理时间,识别性能瓶颈。 - **通用行为应用**:统一设置响应头、处理跨域请求、响应格式化等[^1]。 ### ### 实现 Spring Boot 拦截器的步骤 #### 1. 创建拦截器类 实现 `HandlerInterceptor` 接口,并重写其方法。以下是一个简单的拦截器示例: ```java import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ExampleInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Pre-handle: Request is about to be processed"); return true; // 返回true继续处理,false中断请求 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("Post-handle: Request has been processed"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("After-completion: Request is completed"); } } ``` #### 2. 注册拦截器 通过配置类注册拦截器,并指定拦截路径: ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { private final ExampleInterceptor exampleInterceptor; public WebConfig(ExampleInterceptor exampleInterceptor) { this.exampleInterceptor = exampleInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(exampleInterceptor) .addPathPatterns("/**") // 拦截所有请求 .excludePathPatterns("/public/**"); // 排除特定路径 } } ``` ### ### 高级配置 #### 控制拦截器顺序 在多个拦截器存在的情况下,可以通过配置控制其执行顺序: ```yaml spring: mvc: interceptor: order: 0 # 设置拦截器的优先级 ``` #### 异常处理 拦截器本身不直接处理异常,但可以在 `afterCompletion` 方法中捕获 Controller 抛出的异常,并进行统一处理: ```java @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { if (ex != null) { // 处理异常逻辑 System.out.println("Exception occurred: " + ex.getMessage()); } } ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值