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 publicvoid 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
配置類,然後設定preffix
、suffix
引數進行配置檢視檔案路徑字首與字尾。配置程式碼如下所示:
/** * 配置請求檢視對映 * @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
介面完成方法的實現。