1. 程式人生 > >SpringBoot 很重要的一個類WebMvcConfigurerAdapter 的使用

SpringBoot 很重要的一個類WebMvcConfigurerAdapter 的使用

自定義資源對映addResourceHandlers

比如,我們想自定義靜態資源對映目錄的話,只需重寫addResourceHandlers方法即可。

@Configuration
public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
    /**
     * 配置靜態訪問資源
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(
"/my/**").addResourceLocations("classpath:/my/"); super.addResourceHandlers(registry); } }

通過addResourceHandler新增對映路徑,然後通過addResourceLocations來指定路徑。我們訪問自定義my資料夾中的elephant.jpg 圖片的地址為 http://localhost:8080/my/elephant.jpg

如果你想指定外部的目錄也很簡單,直接addResourceLocations指定即可,程式碼如下:

@Override
    public 
void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/my/**").addResourceLocations("file:E:/my/"); super.addResourceHandlers(registry); }

addResourceLocations指的是檔案放置的目錄,addResoureHandler指的是對外暴露的訪問路徑

配置攔截器

在之前Xml配置形式天下的時候,我們都是在spring-mvc.xml

配置檔案內新增<mvc:interceptor>標籤配置攔截器。攔截器的相關建立請訪問第六章:如何在SpringBoot專案中使用攔截器,攔截器配置如下所示:

    /**
     * 攔截器配置
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        super.addInterceptors(registry);
        registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**");
    }

InterceptorRegistry 內的addInterceptor需要一個實現HandlerInterceptor介面的攔截器例項,addPathPatterns方法用於設定攔截器的過濾路徑規則。

攔截器addInterceptors

攔截器在我們專案中經常使用的,這裡就來介紹下最簡單的判斷是否登入的使用。
要實現攔截器功能需要完成以下2個步驟:

  • 建立我們自己的攔截器類並實現 HandlerInterceptor 介面
  • 其實重寫WebMvcConfigurerAdapter中的addInterceptors方法把自定義的攔截器類新增進來即可

首先,自定義攔截器程式碼:

package com.dudu.interceptor;
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        boolean flag =true;
        User user=(User)request.getSession().getAttribute("user");
        if(null==user){
            response.sendRedirect("toLogin");
            flag = false;
        }else{
            flag = true;
        }
        return flag;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

 

 

這裡我們簡單實現了根據session中是否有User物件來判斷是否登入,為空就跳轉到登入頁,不為空就通過。

接著,重寫WebMvcConfigurerAdapter中的addInterceptors方法如下:

/**
* 攔截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
    // addPathPatterns 用於新增攔截規則
    // excludePathPatterns 使用者排除攔截
    registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/toLogin","/login");
    super.addInterceptors(registry);
}

addPathPatterns("/**")對所有請求都攔截,但是排除了/toLogin/login請求的攔截。

 

配置CORS

跨域我們之前章節也有講到,請訪問第二十五章:SpringBoot新增支援CORS跨域訪問Spring既然為了集成了CORS,那就證明了一點,以後前後端分離是一個開發趨勢,配置程式碼如下所示:

    /**
     * 跨域CORS配置
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        super.addCorsMappings(registry);
        registry.addMapping("/cors/**")
                .allowedHeaders("*")
                .allowedMethods("POST","GET")
                .allowedOrigins("*");
    }

 

配置ViewController

這一個配置在之前是經常被使用到的,最經常用到的就是"/"、"/index"路徑請求時不通過@RequestMapping配置,而是直接通過配置檔案對映指定請求路徑到指定View頁面,當然也是在請求目標頁面時不需要做什麼資料處理才可以這樣使用,配置內容如下所示:

    /**
     * 檢視控制器配置
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        super.addViewControllers(registry);
        registry.addViewController("/").setViewName("/index");
    }

配置ViewResolver

這個對我們來說很熟悉,只要我們配置html、Jsp頁面檢視時就會用到InternalResourceViewResolver配置類,然後設定preffixsuffix引數進行配置檢視檔案路徑字首與字尾。配置程式碼如下所示:

    /**
     * 配置請求檢視對映
     * @return
     */
    @Bean
    public InternalResourceViewResolver resourceViewResolver()
    {
        InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
        //請求檢視檔案的字首地址
        internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
        //請求檢視檔案的字尾
        internalResourceViewResolver.setSuffix(".jsp");
        return internalResourceViewResolver;
    }
 
    /**
     * 檢視配置
     * @param registry
     */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        super.configureViewResolvers(registry);
        registry.viewResolver(resourceViewResolver());
        /*registry.jsp("/WEB-INF/jsp/",".jsp");*/
    }

上述程式碼中方法resourceViewResolver上配置了@Bean註解,該註解會將方法返回值加入到SpringIoc容器內。
而在configureViewResolvers方法內配置檢視對映為resourceViewResolver方法返回的InternalResourceViewResolver例項,這樣完成了檢視的配置。在下面還有註釋掉的一部分程式碼,這塊程式碼很神奇,我們先來看看org.springframework.web.servlet.config.annotation.ViewResolverRegistry原始碼:

package org.springframework.web.servlet.config.annotation;
 
public class ViewResolverRegistry {
    ...//省略程式碼
    public UrlBasedViewResolverRegistration jsp() {
        return this.jsp("/WEB-INF/", ".jsp");
    }
 
    public UrlBasedViewResolverRegistration jsp(String prefix, String suffix) {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix(prefix);
        resolver.setSuffix(suffix);
        this.viewResolvers.add(resolver);
        return new UrlBasedViewResolverRegistration(resolver);
    }
}
...//省略程式碼

配置MessageConverter

這個配置一般針對於Api介面服務程式,配置在請求返回時內容採用什麼轉換器進行轉換,我們最常用到的就是fastJson的轉換,配置如下所示:

/**
     * 訊息內容轉換配置
     * 配置fastJson返回json轉換
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //呼叫父類的配置
        super.configureMessageConverters(converters);
        //建立fastJson訊息轉換器
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        //建立配置類
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        //修改配置返回內容的過濾
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.DisableCircularReferenceDetect,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullStringAsEmpty
        );
        fastConverter.setFastJsonConfig(fastJsonConfig);
        //將fastjson新增到檢視訊息轉換器列表內
        converters.add(fastConverter);
    }

內容轉換都是針對面向介面進行編寫的實現類,都必須implements HttpMessageConverter介面完成方法的實現。