如果要在Spring Boot2中注册一些自定义的拦截器、类型转换器、跨域设置等操作,则需要自定义Spring MVC配置。在Spring Boot 1.5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等,从Spring5.0开始废弃了WebMvcConfigurerAdapter类,所以在Spring Boot2中实现 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里面都是Java8的默认方法。
1.default void addResourceHandlers(ResourceHandlerRegistry registry) {}
通过覆写这个方法来定制静态资源路径映射,Spring Boot默认的静态资源配置是把类路径下的/static、/public、/resources和META-INF/resources文件夹的静态文件直接映射为/**。
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
/**
*静态资源请求/person/** 映射到类路径下的/static/person/ 目录
*/
registry.addResourceHandler("/person/**")
.addResourceLocations("classpath:/static/person/");
}
2.default void addInterceptors(InterceptorRegistry registry){}
通过覆写这个方法来添加拦截器
3.default void addCorsMappings(CorsRegistry registry){}
通过覆写这个方法实现跨域配置的支持
@Override
public void addCorsMappings(CorsRegistry registry) {
//配置允许跨域的路径
registry.addMapping("/**")
//配置允许访问的跨域资源的请求域名
.allowedOrigins("*")
//配置允许访问该跨域资源服务器的请求方法
.allowedHeaders("GET,POST")
//配置允许请求 头部head的访问
.allowedHeaders("*");
}
4.default void addViewControllers(ViewControllerRegistry registry) {}
通过覆写这个方法来实现视图控制器配置
5.default void configureMessageConverters(List
通过覆写这个方法来新增自定义的HttpMessageConverter(消息转换器)
在Spring Boot中,HttpMessageConvertersAutoConfiguration类默认自动注册了StringHttpMessageConverter,还有通过@Import注解注册了JacksonHttpMessageConverterConfiguration和GsonHttpMessageConverterConfiguration。
6.default void addFormatters(FormatterRegistry registry){}
通过覆写这个方法来添加数据格式器。Spring MVC接收HTTP请求会把请求参数自动绑定映射到Controller请求参数上。Spring 中没有默认配置将字符串转换为日期类型。可以通过添加一个DateFormatter类来实现自动转换。
@Override
public void addFormatters(FormatterRegistry registry) {
//字符串类型转为日期类型
registry.addFormatter(new DateFormatter("yyyy-MM-dd"));
}
7.default void configureViewResolvers(ViewResolverRegistry registry){}
通过覆写这个方法来配置视图解析器。比如配置FreeMarker、Thymeleaf 等视图解析器。
**
* 自定义拦截器
* 拦截器主要作用是拦截用户的请求并进行相应的处理。比如通过拦截器来进行用户权限验证,或者用来判断当前用户是否已经登录等。
*
* @author David Lin
* @version: 1.0
* @date 2020-02-09 22:03
*/
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
/**
* 该方法将在请求处理之前被调用
*
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
log.error("自定义的拦截器调用了1");
return true;
}
/**
* 该方法在当前请求被处理之后,也就是Controller方法被调用之后执行。
* 在DispatcherServlet进行视图返回渲染之前被调用
*
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
log.error("自定义的拦截器调用了2");
}
/**
* 该方法将在整个请求结束之后,也就是DispatcherServlet渲染了对应的视图之后执行。
*
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
}
}
**
* 自定义MVC配置
*
* @author David Lin
* @version: 1.0
* @date 2020-02-09 18:21
*/
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册自定义拦截器
registry.addInterceptor(myInterceptor())
//添加拦截路径 拦截所有请求
.addPathPatterns("/**")
//白名单 排除拦截路径
.excludePathPatterns("/login", "/api", "/index", "/**/*.js", "/**/*.css", "/**/*.jpg", "/**/*.png");
}
@Bean
public MyInterceptor myInterceptor() {
return new MyInterceptor();
}
1.引入Maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.61</version>
</dependency>
2.代码实现
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//新增自定义的HttpMessageConverter
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
//创建FastJson配置类
FastJsonConfig fastJsonConfig = new FastJsonConfig();
//定制Json序列化策略
fastJsonConfig.setSerializerFeatures(
SerializerFeature.WriteNullNumberAsZero,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteMapNullValue);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
// 处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
converters.add(fastJsonHttpMessageConverter);
}