SpringBoot2.x學習-自定義Spring MVC配置

一、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);
    }

發佈了32 篇原創文章 · 獲贊 15 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章