WebMvcConfigurer


1 WebMvcConfigurer是一個接口,提供很多自定義的攔截器,例如跨域設置、類型轉化器等等。可以說此接口為開發者提前想到了很多攔截層面的需求,方便開發者自由選擇使用。由於Spring5.0廢棄了WebMvcConfigurerAdapter,所以WebMvcConfigurer繼承了WebMvcConfigurerAdapter大部分內容。

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。是在用的太少了,就不再看了。

package org.springframework.web.servlet.config.annotation;
/**
 * 篇幅原因,我們先只介紹Spring mvc常用的一些方法
 */
public interface WebMvcConfigurer {

    void addFormatters(FormatterRegistry registry);

    void configureMessageConverters(List<HttpMessageConverter<?>> converters);

    void extendMessageConverters(List<HttpMessageConverter<?>> converters);

    Validator getValidator();

    /* 配置內容裁決的一些選項*/
    void configureContentNegotiation(ContentNegotiationConfigurer configurer);

    void configureAsyncSupport(AsyncSupportConfigurer configurer);

    /* @since 4.0.3 */
    void configurePathMatch(PathMatchConfigurer configurer);

    /*參數解析*/
    void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers);

    /*返回值解析*/
    void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers);

    /*異常處理*/
    void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers);

    void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers);

    void addInterceptors(InterceptorRegistry registry);

    MessageCodesResolver getMessageCodesResolver();

    void addViewControllers(ViewControllerRegistry registry);

    /**
     * 這里配置視圖解析器
     */
    void configureViewResolvers(ViewResolverRegistry registry);

    /**
     *靜態資源處理
     */
    void addResourceHandlers(ResourceHandlerRegistry registry);

    void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);

    void addCorsMappings(CorsRegistry registry);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM