在上篇文章中,我們遇到了接口WebMvcConfigurer。今天就來大概看一下里面的方法都有什么吧。
為什么要使用WebMvcConfigurer?
WebMvcConfigurer是一個接口,提供很多自定義的攔截器,例如跨域設置、類型轉化器等等。可以說此接口為開發者提前想到了很多攔截層面的需求,方便開發者自由選擇使用。由於Spring5.0廢棄了WebMvcConfigurerAdapter,所以WebMvcConfigurer繼承了WebMvcConfigurerAdapter大部分內容。
WebMvcConfigurer方法介紹
由於內容太多,只展示3個關鍵的接口,用的比較少的,只是闡述下含義,不再詳解,用的更少的,就不看了,畢竟十多個方法呢...
1.configurePathMatch(PathMatchConfigurer configurer)
這個用到的比較少,這個是和訪問路徑有關的。舉個例子,比如說PathMatchConfigurer 有個配置是setUseTrailingSlashMatch(),如果設置為true的話(默認為true),后面加個斜杠並不影響路徑訪問,例如“/user”等同於“/user/"。我們在開發中很少在訪問路徑上搞事情,所以這個方法如果有需要的請自行研究吧。
2.configureContentNegotiation(ContentNegotiationConfigurer configurer)
這個東西直譯叫做內容協商機制,主要是方便一個請求路徑返回多個數據格式。ContentNegotiationConfigurer這個配置里面你會看到MediaType,里面有眾多的格式。此方法不在多贅述。
3.configureAsyncSupport(AsyncSupportConfigurer configurer)
顧名思義,這是處理異步請求的。只能設置兩個值,一個超時時間(毫秒,Tomcat下默認是10000毫秒,即10秒),還有一個是AsyncTaskExecutor,異步任務執行器。
4.configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
這個接口可以實現靜態文件可以像Servlet一樣被訪問。
5.addFormatters(FormatterRegistry registry)
增加轉化器或者格式化器。這邊不僅可以把時間轉化成你需要時區或者樣式。還可以自定義轉化器和你數據庫做交互,比如傳進來userId,經過轉化可以拿到user對象。
6.addInterceptors(InterceptorRegistry registry)
盼望着,盼望着,你一個常用的方法來了。這個方法可以自定義寫攔截器,並指定攔截路徑。來,咱們寫一個攔截器。
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle,ok,假設給你一個true,運行去吧");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle,ok,看看我什么時候運行的。");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion,ok,看完不點個贊再走嗎?");
}
}
然后配置一下:
@Configuration
public class MyConfigurer implements WebMvcConfigurer {
@Bean
public MyInterceptor getMyInterceptor(){
return new MyInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(this.getMyInterceptor())
.addPathPatterns("/abc","/configurePathMatch");
}
}
可以看出addPathPatterns()里面可以嘗試添加多個路徑,或者寫成”/**“,包含所有路徑都需要嘗試攔截一下。
測試一下,輸出:
preHandle,ok,假設給你一個true,運行去吧
===》執行業務邏輯===》
postHandle,ok,看看我什么時候運行的。
afterCompletion,ok,看完不點個贊再走嗎?
7.addResourceHandlers(ResourceHandlerRegistry registry)
自定義資源映射。這個東西也比較常用,業務場景就是自己的服務器作為文件服務器,不利用第三方的圖床,就需要一個虛擬路徑映射到我們服務器的地址。值得一提的是,如果你的項目是war包啟動,一般都是再Tomcat中配置一下(配置方法請百度);如果是jar包啟動(SpringBoot經常用這種方式啟動),就可以用到這個方法了。例如:
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/my/**")
.addResourceLocations("file:E:/my/");
super.addResourceHandlers(registry);
}
真實路徑,wndows當服務器的情況下,前面一定要加上一個file:。
8.addCorsMappings(CorsRegistry registry)
這個是設置跨域問題的,幾乎是每個后台服務器都需要配置的東西。我曾寫過一篇文章,專門講跨域問題和SpringBoot怎么配置的,請查詢:
https://juejin.im/post/5cfe6367f265da1b9163887f
9.addViewControllers(ViewControllerRegistry registry)
這個方法可以實現,一個路徑自動跳轉到一個頁面。不過現在多為前后端分離的項目,是不是可以把跳轉路由的問題直接扔給前端。
后面還有七個:configureViewResolvers、addArgumentResolvers、addReturnValueHandlers、configureMessageConverters、extendMessageConverters、configureHandlerExceptionResolvers、extendHandlerExceptionResolvers。是在用的太少了,就不再看了。
小結
本篇先大概知道下這些都是什么方法,最重要的是知道了WebMvcConfigurer為我們再攔截層做了一些通用攔截器,方便開發者使用。當然也可以自己實現攔截器。最常用的是還是6、7、8。其他的以后有機會研究好了再更新。