問題描述:使用springboot 2.0后,按照springboot 1.5版本(以下簡稱舊版)的方式去配置項目。結果發現靜態資源訪問不到了,本文對此情況分析、處理
項目結構:
- 直接上圖

如果是在舊版,需要訪問下圖靜態資源,

地址應該為: localhost:8080/admin/js/base.js
原因在於:META-INF/resources / resources / static / public 都是spring boot 認為靜態資源應該放置的位置,會自動去尋找靜態資源
然而,在2.0之后 就發生了變化。
先看本文的基礎,攔截器
BaseInterceptor
-
毫無疑問,需要定義一個類:
BaseInterceptor應實現HandlerInterceptor -
在其
preHandle中 需要重寫,自定義攔截配置,大概如下圖:

-
作用:攔截沒有登錄,並試圖知己訪問后台的地址的操作。
再看本文的關鍵,WebMvcConfig
-
此類需要實現
WebMvcConfigurer -
在舊版中,一般繼承
WebMvcConfigurerAdapter類,但由於2.0后,WebMvcConfigurer接口中定義了很多default方法(基於jdk1.8+ ) -
WebMvcConfigurer中配置如下: -
注意:需要在重寫的第二個方法中,添加靜態資源路徑,這是能否被識別的關鍵
@Component
public class WebMvcConfig implements WebMvcConfigurer {
@Resource
private BaseInterceptor baseInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(baseInterceptor)
//需要配置2:----------- 告知攔截器:/static/admin/** 與 /static/user/** 不需要攔截 (配置的是 路徑)
.excludePathPatterns("/static/admin/**", "/static/user/**");
}
/**
* 添加靜態資源文件,外部可以直接訪問地址
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//其他靜態資源,與本文關系不大
registry.addResourceHandler("/upload/**").addResourceLocations("file:"+ TaleUtils.getUplodFilePath()+"upload/");
//需要配置1:----------- 需要告知系統,這是要被當成靜態文件的!
//第一個方法設置訪問路徑前綴,第二個方法設置資源路徑
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//registry.addViewController("/error/404").setViewName("/admin/page_error/error_404.html");
}
}
按照如上配置
- 訪問:
http://localhost:9090/static/admin/js/base.js,即可正常訪問到。 - 也就是在html文件中,不要像之前一樣,
/admin/js/base.js而應該在前方加上addResourceHandlers中配置的名字
之前誰在攔截靜態資源?
- 可以在aseInterceptor 中的 preHandle() 方法體內打斷點,會發現訪問static下的靜態資源時候會進入此方法。
- 也就是被其當做正常的訪問路徑去識別。導致無法正常加載。
- 換句話說,也就是配置的不完整,導致靜態資源沒有被識別。
還可以參考
https://my.oschina.net/dengfuwei/blog/1795346
- 在
WebMvcConfig的addInterceptors方法中,添加排除路徑; - 但是尷尬的是,我copy的項目結構不太一樣,static/template下方都有 admin文件夾,並且登錄訪問還是admin開始
- 如果排除靜態資源的話,那些需要跳轉的html也被排除了 。
18-5-23日更新
- 原文中的配置還是有問題!
- 還是應該在
WebMvcConfig中的addInterceptors排除路徑,原來雖然能訪問到靜態資源,但是還是被攔截器中的preHandle攔截! - 所以還是應該配置排除攔截的路徑,上方
WebMvcConfig類中內容已更改~
18-7-31日更新
- 僅供參考。等搞清楚再來更新。
