为何要使用WebMvcConfigurer?
WebMvcConfigurer是一个接口,提供不少自定义的拦截器,例如跨域设置、类型转化器等等。能够说此接口为开发者提早想到了不少拦截层面的需求,方便开发者自由选择使用。因为Spring5.0废弃了WebMvcConfigurerAdapter,因此WebMvcConfigurer继承了WebMvcConfigurerAdapter大部份内容。
首先我们打开这个接口所定义的哪些方法
public interface WebMvcConfigurer { default void configurePathMatch(PathMatchConfigurer configurer) {} default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {} default void configureAsyncSupport(AsyncSupportConfigurer configurer) {} default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {} 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> resolvers) {} @Nullable default Validator getValidator() { return null; } @Nullable default MessageCodesResolver getMessageCodesResolver() { return null; } }
这里面定义了N多个方法供我们自定义添加配置,其中这里我就挑几个比较常用的来示范下它的用途
一、addInterceptors
从名字上看我们就可以猜到是添加自定义拦截器的,这个方法能够自定义写拦截器,并指定拦截路径,下面来示范下
- 定义HandlerInterceptor
public class MyInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle:假设这里请求前进行判断是否有登陆"); //假设这里请求前进行判断是否有登陆,有则return true,无则false return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { //请求中处理,也就是HandlerAdapter处理Handler后在返回视图前执行该方法 System.out.println("postHandle==requestUrl:"+request.getRequestURI()); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { //提交视图后执行该方法 System.out.println("afterCompletion==requestUrl:"+request.getRequestURI()); } }
- 定义WebMvcConfigurer添加addInterceptors
@Configuration public class MyWebMvcConfigurer implements WebMvcConfigurer { @Override // .addPathPatterns("/**")表示拦截所有请求;.excludePathPatterns("/user/login")表示不拦截该请求 public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/login"); } }
- 定义controller
@RestController @RequestMapping("/user") public class UserController { @RequestMapping("/login") public String index() { return "hello springmvc!login"; } @RequestMapping("/get") public String get(){ return "hello springmvc!get"; } }
- 执行结果
调用login方法:

因为是login故这里是不会进拦截,所以就不会打印任何东西
请求get方法:

这里进了拦截器所以会进行打印操作
二、addArgumentResolvers
从方法参数上可以猜测到添加自定义HandlerMethodArgumentResolver参数解析,下面我们来操作看下
- 定义HandlerMethodArgumentResolver:
class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterType().getName().equals(UserA.class.getName());//仅对UserA有效 } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { //模拟从session中获取登陆的用户信息 Object attribute = webRequest.getAttribute("user", NativeWebRequest.SCOPE_SESSION);//Request中的用户属性 //然后放入UserA的对象里 //这里直接写死一个 attribute = new UserA("sessionUserName", 20); return attribute; } }
- 定义WebMvcConfigurer添加addArgumentResolvers:
@Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(new MyHandlerMethodArgumentResolver()); }
- 定义controller:
@RequestMapping("/index") public String index(UserA userA){ return "hello springmvc!userA:"+userA; }
- 执行结果:

这里能看取到在resolveArgument赋值的userA
三、addResourceHandlers
静态资源访问
- 我们直接重写addResourceHandlers方法:
@Configuration public class MyWebMvcConfigurer implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/file/**").addResourceLocations("classpath:/static/","file:D:/tomcat/"); } }
addResourceHandler(“/file/**”)添加对外访问路径,addResourceLocations添加本地目录资源路径
- 本地资源:

- 访问资源:

四、addCorsMappings(CorsRegistry registry)
这个是设置跨域问题的,几乎是每一个后台服务器都须要配置的东西。
本篇先大概知道下这些都是什么方法,最重要的是知道了WebMvcConfigurer为咱们再拦截层作了一些通用拦截器,方便开发者使用