Spring Boot乾貨系列:(六)靜態資源和攔截器處理

前言

本章我們來介紹下SpringBoot對靜態資源的支持以及很重要的一個類WebMvcConfigurerAdapter。

正文

前面章節我們也有簡單介紹過SpringBoot中對靜態資源的默認支持,今天詳細的來介紹下默認的支持,以及自定義擴展如何實現。

默認資源映射

Spring Boot 默認爲我們提供了靜態資源處理,使用 WebMvcAutoConfiguration 中的配置各種屬性。

建議大家使用Spring Boot的默認配置方式,提供的靜態資源映射如下:

  • classpath:/META-INF/resources

  • classpath:/resources

  • classpath:/static

  • classpath:/public

在工程裏面路徑是這樣:

Spring Boot乾貨系列:(六)靜態資源和攔截器處理

上面這幾個都是靜態資源的映射路徑,優先級順序爲:META-INF/resources > resources > static > public

大家可以自己在上面4個路徑下都放一張同名的圖片,訪問一下即可驗證。

還有,你可以隨機在上面一個路徑下面放上index.html,當我們訪問應用根目錄http://lcoalhost:8080 時,會直接映射到index.html頁面。

對應的配置文件配置如下:

Spring Boot乾貨系列:(六)靜態資源和攔截器處理

我們可以通過修改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方法即可達到效果了

Spring Boot乾貨系列:(六)靜態資源和攔截器處理

值的指出的是,在這裏重寫addViewControllers方法,並不會覆蓋WebMvcAutoConfiguration中的addViewControllers(在此方法中,Spring Boot將“/”映射至index.html),這也就意味着我們自己的配置和Spring Boot的自動配置同時有效,這也是我們推薦添加自己的MVC配置的方式。

攔截器addInterceptors

攔截器在我們項目中經常使用的,這裏就來介紹下最簡單的判斷是否登錄的使用。

要實現攔截器功能需要完成以下2個步驟:

  • 創建我們自己的攔截器類並實現 HandlerInterceptor 接口

  • 其實重寫WebMvcConfigurerAdapter中的addInterceptors方法把自定義的攔截器類添加進來即可

首先,自定義攔截器代碼:

Spring Boot乾貨系列:(六)靜態資源和攔截器處理

這裏我們簡單實現了根據session中是否有User對象來判斷是否登錄,爲空就跳轉到登錄頁,不爲空就通過。

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

Spring Boot乾貨系列:(六)靜態資源和攔截器處理

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

頁面登錄關鍵代碼:

Spring Boot乾貨系列:(六)靜態資源和攔截器處理

控制器代碼:

Spring Boot乾貨系列:(六)靜態資源和攔截器處理

這樣訪問的時候,如果未登錄就會跳轉到login.html頁面,而訪問http://localhost:8080/toLogin 和http://localhost:8080/login 不會被攔截。

Spring Boot乾貨系列:(六)靜態資源和攔截器處理

更多配置可以查看WebMvcConfigurerAdapter的類的API。因其是WebMvcConfigurer接口的實現,所以WebMvcConfigurer的API方法也可以用來配置MVC。

只是實現這個接口的話,要實現所有的方法,這個就尷尬了。

所以還是推薦使用繼承WebMvcConfigurerAdapter類來處理。

總結

靜態資源跟攔截器在平時項目中經常用到,弄懂如何處理是很有用的。今天就到此爲止,下一篇將來介紹一下項目中如何使用日誌。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章