文章目錄
一、WebMvcConfigurer接口
1.介紹
如果要在Spring Boot2中註冊一些自定義的攔截器、類型轉換器、跨域設置等操作,則需要自定義Spring MVC配置。在Spring Boot 1.5版本都是靠重寫WebMvcConfigurerAdapter的方法來添加自定義攔截器,消息轉換器等,從Spring5.0開始廢棄了WebMvcConfigurerAdapter類,所以在Spring Boot2中實現 WebMvcConfigurer這個接口即可。
2.WebMvcConfigurer源碼
1.接口源碼
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的默認方法。
2.WebMvcConfigurer接口方法說明
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<?>> converters){}
通過覆寫這個方法來新增自定義的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 等視圖解析器。
二、示例代碼實現
1.註冊自定義攔截器
**
* 自定義攔截器
* 攔截器主要作用是攔截用戶的請求並進行相應的處理。比如通過攔截器來進行用戶權限驗證,或者用來判斷當前用戶是否已經登錄等。
*
* @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();
}
2.新增自定義FastJsonHttpMessageConverter
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);
}