SpringBoot-WebMvcConfigurer详解
WebMvcConfigurer
- 1. 简介
- 2. WebMvcconfigurer接口
- 3. WebMvcConfigurer接口详解
- 3.1 配置拦截器 addInterceptors(InterceptorRegistry registry)
- 3.2 页面跳转addViewControllers(ViewControllerRegistry registry)
- 3.3 配置自定义静态资源映射目录 addResourceHandlers(ResourceHandlerRegistry registry)
- 3.4 配置默认静态资源处理器 configureDefaultServletHanding(DefaultServletHandler
- 3.5 配置视图解析器 configureViewResolvers(ViewResolverRegistry registry)
- 3.6 配置内容协商的一些参数configureContentNegotiation(ContentNegotiationConfigurer configurer)
- 3.7 配置跨域 addCorsMappings(CorsRegistry registry)
- 3.8 配置信息转换器 configureMessageConverters(List
1. 简介
WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些 Handler、Interceptor、ViewResolver、MessageConverter。基于java-based方式的spring mvc配置,需要创建一个配置类(@Configuration注解标识) 并实现 WebMvcConfigurer 接口;
在SpringBoot 1.5版本都是靠重写 WebMvcConfigurerAdapter 的方式来添加自定义拦截器,消息转换器等。SpringBoot2.0 后,该类被标识为@Deprecated。官方推荐直接实现WebMvcConfigurer(推荐)或者直接继承WebMVCConfigurationSupport。
2. WebMvcconfigurer接口
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; }
}
WebMvcConfigurer常用接口:
1.addInterceptors:拦截器
2.addViewControllers:页面跳转
3. addResourceHandlers:静态资源
4. configureDefaultServletHandling:默认静态资源处理器
5. configureViewResolvers:视图解析器
6. configureContentNegotiation:配置内容裁决的一些参数
7. addCorsMappings:跨域
8. configureMessageConverters:信息转换器
3. WebMvcConfigurer接口详解
3.1 配置拦截器 addInterceptors(InterceptorRegistry registry)
①addInterceptor : 需要一个实现HandlerInterceptor接口的拦截器实例
public InterceptorRegistration addInterceptor(HandlerInterceptor interceptor) {
InterceptorRegistration registration = new InterceptorRegistration(interceptor);
this.registrations.add(registration);
return registration;
}
②addPathPatterns: 用于设置拦截器的过滤路径规则;addPathPatterns(“/**”)
对所有请求都拦截
public InterceptorRegistration addPathPatterns(String... patterns) {
return this.addPathPatterns(Arrays.asList(patterns));
}
public InterceptorRegistration addPathPatterns(List<String> patterns) {
this.includePatterns.addAll(patterns);
return this;
}
③excludePathPatterns: 用于设置不需要拦截的过滤规则;excludePathPatterns("/emp/toLogin","/js/**","/css/**","/images/**")
;
public InterceptorRegistration excludePathPatterns(String... patterns) {
return this.excludePathPatterns(Arrays.asList(patterns));
}
public InterceptorRegistration excludePathPatterns(List<String> patterns) {
this.excludePatterns.addAll(patterns);
return this;
}
HandlerInterceptor接口:
public interface HandlerInterceptor {
// 在请求处理之前进行调用(Controller方法调用之前)
// 只有返回true才会继续向下执行,返回false取消当前请求。
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
// 请求处理之后调用,但在视图被渲染之前
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
// 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要用于进行资源清理工作)
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
3.2 页面跳转addViewControllers(ViewControllerRegistry registry)
以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurer中的addViewControllers方法即可达到效果了
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/toLogin").setViewName("login");
}
注意:这里重写addViewControllers方法,并不会覆盖WebMvcAutoConfiguration(SpringBoot自动配置)中的addViewControllers(在此方法中,SpringBoot将”/”映射至index.html),这也就意味着这里的配置和SpringBoot的自动配置同时有效。
3.3 配置自定义静态资源映射目录 addResourceHandlers(ResourceHandlerRegistry registry)
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/");
}
addResourceHandler:指的是对外暴露的访问路径
addResourceLocations:指的是内部文件存放的目录(真实路径,windows/linux当服务器的情况下,前面一定要加上一个file: 比如:file:E:/xxx/ )
值得一提的是,如果你的项目是war包启动,一般都是再Tomcat中配置一下;如果是jar包启动(SpringBoot经常用这种方式启动),就可以用到这个方法了。
3.4 配置默认静态资源处理器 configureDefaultServletHanding(DefaultServletHandler
Configurer configurer)
3.5 配置视图解析器 configureViewResolvers(ViewResolverRegistry registry)
该方法的参数ViewResolverRegistry是一个注册器,用来注册你想自定义的视图解析器等。
3.5.1 配置请求视图映射
@Bean
Public InternalResourceViewResolver internalResourceViewResolver() {
InternalResourceViewResolver obj = new InternalResourceViewResolver();
// 请求视图前缀
obj.setPrefix(“/WEB-INF/jsp/”);
// 请求视图后缀
obj.setSuffix(“.jsp”);
return obj;
}
3.5.2 视图配置
@Override
Public void configureViewResolvers(ViewResolverRegistry registry) {
/*registry.jsp("/WEB-INF/jsp/",".jsp");*/
registry.viewResolver(internalResourceViewResolver());
}
3.6 配置内容协商的一些参数configureContentNegotiation(ContentNegotiationConfigurer configurer)
内容协商: 在 HTTP 协议中,内容协商是这样一种机制,通过为同一 URI 指向的资源提供不同的展现形式,可以使用户代理选择与用户需求相适应的最佳匹配(例如,文档使用的自然语言,图片的格式,或者内容编码形式)。
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
/* 是否通过请求Url的扩展名来决定media type */
configurer.favorPathExtension(true)
/* 不检查Accept请求头 */
.ignoreAcceptHeader(true)
.parameterName("mediaType")
/* 设置默认的media yype */
.defaultContentType(MediaType.TEXT_HTML)
/* 请求以.html结尾的会被当成MediaType.TEXT_HTML*/
.mediaType("html", MediaType.TEXT_HTML)
/* 请求以.json结尾的会被当成MediaType.APPLICATION_JSON*/
.mediaType("json", MediaType.APPLICATION_JSON);
}
上面代码说白了就是告诉系统什么类型用什么来标识。
3.7 配置跨域 addCorsMappings(CorsRegistry registry)
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/cors/**")
.allowedHeaders("*")
.allowedMethods("POST","GET")
.allowedOrigins("*");
}
3.8 配置信息转换器 configureMessageConverters(List<HttpMessageConverter<?>> converters)
这个配置一般针对于Api接口服务程序,配置在请求返回时内容采用什么转换器进行转换,我们最常用到的就是fastJson的转换,配置如下所示:
/**
* 消息内容转换配置
* 配置fastJson返回json转换
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
/1.需要定义一个convert转换消息的对象;
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
//2.添加fastJson的配置信息,比如:是否要格式化返回的json数据;
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.WriteDateUseDateFormat);
//3处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
//4.在convert中添加配置信息.
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
//5.将convert添加到converters当中.
converters.add(fastJsonHttpMessageConverter);
}
内容转换都是针对面向接口进行编写的实现类,都必须implements HttpMessageConverter接口完成方法的实现。
3.9 配置异步请求处理 configureAsyncSupport(AsyncSupportConfigurer configurer)
处理异步请求。只能设置两个值,一个超时时间(毫秒,Tomcat下默认是10000毫秒,即10秒),还有一个是AsyncTaskExecutor 异步任务执行器。
3.10 addFormatters(FormatterRegistry registry)
增加转换器或者格式化器。这边不仅可以把时间转化成你需要时区或者样式。还可以自定义转化器和你数据库做交互,比如传进来userId,经过转化可以拿到user对象。