前言
本章我們來介紹下SpringBoot對靜態資源的支持以及很重要的一個類WebMvcConfigurerAdapter。
正文
前面章節我們也有簡單介紹過SpringBoot中對靜態資源的默認支持,今天詳細的來介紹下默認的支持,以及自定義擴展如何實現。
默認資源映射
Spring Boot 默認爲我們提供了靜態資源處理,使用 WebMvcAutoConfiguration 中的配置各種屬性。
建議大家使用Spring Boot的默認配置方式,提供的靜態資源映射如下:
-
classpath:/META-INF/resources
-
classpath:/resources
-
classpath:/static
-
classpath:/public
在工程裏面路徑是這樣:
上面這幾個都是靜態資源的映射路徑,優先級順序爲:META-INF/resources > resources > static > public
大家可以自己在上面4個路徑下都放一張同名的圖片,訪問一下即可驗證。
還有,你可以隨機在上面一個路徑下面放上index.html,當我們訪問應用根目錄http://lcoalhost:8080 時,會直接映射到index.html頁面。
對應的配置文件配置如下:
我們可以通過修改spring.mvc.static-path-pattern來修改默認的映射,例如我改成/dudu/**,那運行的時候訪問 http://lcoalhost:8080/dudu/index.html 纔對應到index.html頁面。
接管Spring Boot的Web配置
如果Spring Boot提供的Sping MVC不符合要求,則可以通過一個配置類(註解有@Configuration的類)加上@EnableWebMvc註解來實現完全自己控制的MVC配置。
當然,通常情況下,Spring Boot的自動配置是符合我們大多數需求的。在你既需要保留Spring Boot提供的便利,有需要增加自己的額外的配置的時候,可以定義一個配置類並繼承WebMvcConfigurerAdapter,無需使用@EnableWebMvc註解。
這裏我們提到這個WebMvcConfigurerAdapter這個類,重寫這個類中的方法可以讓我們增加額外的配置,這裏我們就介紹幾個常用的。
自定義資源映射addResourceHandlers
比如,我們想自定義靜態資源映射目錄的話,只需重寫addResourceHandlers方法即可。
@Configuration
public static class WebMvcConfig 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指定即可,代碼如下:
/**
* 配置靜態訪問資源
* param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/my/**").addResourceLocations("file:e:/my/");
super.addResourceHandlers(registry);
}
addResourceLocations指的是文件放置的目錄,addResoureHandler指的是對外暴露的訪問路徑
頁面跳轉addViewControllers
以前寫SpringMVC的時候,如果需要訪問一個頁面,必須要寫Controller類,然後再寫一個方法跳轉到頁面,感覺好麻煩,其實重寫WebMvcConfigurerAdapter中的addViewControllers方法即可達到效果了
值的指出的是,在這裏重寫addViewControllers方法,並不會覆蓋WebMvcAutoConfiguration中的addViewControllers(在此方法中,Spring Boot將“/”映射至index.html),這也就意味着我們自己的配置和Spring Boot的自動配置同時有效,這也是我們推薦添加自己的MVC配置的方式。
攔截器addInterceptors
攔截器在我們項目中經常使用的,這裏就來介紹下最簡單的判斷是否登錄的使用。
要實現攔截器功能需要完成以下2個步驟:
-
創建我們自己的攔截器類並實現 HandlerInterceptor 接口
-
其實重寫WebMvcConfigurerAdapter中的addInterceptors方法把自定義的攔截器類添加進來即可
首先,自定義攔截器代碼:
這裏我們簡單實現了根據session中是否有User對象來判斷是否登錄,爲空就跳轉到登錄頁,不爲空就通過。
接着,重寫WebMvcConfigurerAdapter中的addInterceptors方法如下:
addPathPatterns("/**")對所有請求都攔截,但是排除了/toLogin和/login請求的攔截。
頁面登錄關鍵代碼:
控制器代碼:
這樣訪問的時候,如果未登錄就會跳轉到login.html頁面,而訪問http://localhost:8080/toLogin 和http://localhost:8080/login 不會被攔截。
更多配置可以查看WebMvcConfigurerAdapter的類的API。因其是WebMvcConfigurer接口的實現,所以WebMvcConfigurer的API方法也可以用來配置MVC。
只是實現這個接口的話,要實現所有的方法,這個就尷尬了。
所以還是推薦使用繼承WebMvcConfigurerAdapter類來處理。
總結
靜態資源跟攔截器在平時項目中經常用到,弄懂如何處理是很有用的。今天就到此爲止,下一篇將來介紹一下項目中如何使用日誌。