springboot應(yīng)用中靜態(tài)資源訪問與接口請求沖突問題解決
詭異得問題總是難以避免,發(fā)生了就有必要把經(jīng)驗留下來。在開發(fā)過程中很少見過當(dāng)靜態(tài)資源請求路徑與接口請求路徑前綴重疊得情況下發(fā)生異常,但就是遇到了:請求/hello/test.js /hello/testxxxx等路徑 卻能進(jìn)入到接口/hello/test對應(yīng)的方法內(nèi)。遇到這樣得問題應(yīng)該怎么辦呢?本文通過以下幾個串起來得問題分享一下經(jīng)驗。
問題一:“springboot js文件請求路徑 會被controller接收到”
在 Spring Boot 中,默認(rèn)情況下,靜態(tài)資源文件(如 JavaScript 文件)的請求路徑不會被交由 Controller 處理。Spring Boot 的自動配置會將靜態(tài)資源的請求路徑與靜態(tài)資源文件夾進(jìn)行映射,以直接返回對應(yīng)的靜態(tài)資源文件,而不經(jīng)過 Controller。
默認(rèn)情況下,Spring Boot 將靜態(tài)資源文件放置在以下目錄中:
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
如果你將 JavaScript 文件放置在這些目錄中的任何一個,并且請求路徑與該文件的相對路徑匹配,Spring Boot 將會直接返回該靜態(tài)資源文件,而不會將請求交由 Controller。
如果你遇到了 JavaScript 文件的請求路徑被 Controller 接收到的問題,可能是因為以下情況之一:
- 靜態(tài)資源文件放置位置不正確:請確保你的 JavaScript 文件確實放置在 Spring Boot 默認(rèn)的靜態(tài)資源文件夾中(如 static 文件夾)。如果你將靜態(tài)資源文件放置在其他位置,可能會導(dǎo)致請求被 Controller 接收到。
- 配置了自定義的靜態(tài)資源處理器:如果你在 Spring Boot 中配置了自定義的靜態(tài)資源處理器,可能會導(dǎo)致請求被 Controller 接收到。請檢查你的配置,確保不會覆蓋默認(rèn)的靜態(tài)資源處理器。
- 路徑匹配問題:請確保你的 JavaScript 文件的請求路徑與實際文件的相對路徑匹配。如果路徑不匹配,可能會導(dǎo)致請求被交由 Controller 處理。
請檢查以上可能的原因,并根據(jù)具體情況進(jìn)行調(diào)整。確保靜態(tài)資源文件的位置正確,并且請求路徑與實際文件的相對路徑匹配。這樣,請求就應(yīng)該會直接返回對應(yīng)的靜態(tài)資源文件,而不會被 Controller 接收到。
問題二:“如何在 Spring Boot 中配置了自定義的靜態(tài)資源處理器”
在 Spring Boot 中,你可以通過實現(xiàn) WebMvcConfigurer 接口并重寫 addResourceHandlers() 方法來配置自定義的靜態(tài)資源處理器。
下面是一個示例,展示如何配置自定義的靜態(tài)資源處理器:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/custom/**")
.addResourceLocations("classpath:/custom/")
.setCachePeriod(3600)
.resourceChain(true)
.addResolver(new PathResourceResolver());
}
}在上面的示例中,我們創(chuàng)建了一個名為 WebConfig 的配置類,并實現(xiàn)了 WebMvcConfigurer 接口。在 addResourceHandlers() 方法中,我們通過 ResourceHandlerRegistry 對象進(jìn)行配置。
- addResourceHandler("/custom/**") 指定了靜態(tài)資源的 URL 路徑模式,這里是 /custom/**。
- addResourceLocations("classpath:/custom/") 指定了靜態(tài)資源文件的存放位置,這里是 classpath:/custom/,即 classpath 下的 custom 目錄。
- setCachePeriod(3600) 設(shè)置了靜態(tài)資源的緩存時間,這里是 3600 秒。
- resourceChain(true) 啟用資源鏈。這將在開發(fā)環(huán)境中提供更好的性能,并啟用對版本化資源的支持。
- addResolver(new PathResourceResolver()) 添加了一個路徑解析器,用于解析靜態(tài)資源路徑。
在上述配置中,我們將自定義的靜態(tài)資源放置在 classpath 下的 custom 目錄中。你可以根據(jù)自己的需求修改路徑和其他屬性。
配置完成后,你可以將靜態(tài)資源文件放置在指定的位置,并通過 /custom/** 的路徑模式來訪問這些靜態(tài)資源。
請確保將上述配置類正確地添加到你的 Spring Boot 項目中,以便生效并使用自定義的靜態(tài)資源處理器。
問題三:“springboot開發(fā)得應(yīng)用組件內(nèi)自定義了靜態(tài)資源處理器,依賴于這個組件得系統(tǒng)無法讀取static下得文件,如何處理”
如果你基于 Spring Boot 開發(fā)的組件需要增加一個靜態(tài)資源目錄,同時又希望不影響依賴于這個組件的工程自有的靜態(tài)資源配置,可以通過自定義配置類和資源處理器來實現(xiàn)。
下面是一種可行的方法:
在組件的配置類中,添加自定義的資源處理器,并指定自己的靜態(tài)資源目錄。
@Configuration
public class MyComponentConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/mycomponent/**")
.addResourceLocations("classpath:/mycomponent-static/");
}
}在上述示例中,我們將 /mycomponent/** 的請求路徑映射到 classpath:/mycomponent-static/ 目錄下的靜態(tài)資源。
在工程自有的配置類中,繼承 WebMvcConfigurerAdapter,并添加自己的靜態(tài)資源配置。
@Configuration
public class ApplicationConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/app/**")
.addResourceLocations("classpath:/app-static/");
}
}在上述示例中,我們將 /app/** 的請求路徑映射到 classpath:/app-static/ 目錄下的工程自有的靜態(tài)資源。
通過以上配置,組件和工程可以分別擁有自己的靜態(tài)資源目錄,并且互相不會影響。請求 /mycomponent/** 會訪問組件的靜態(tài)資源目錄,而請求 /app/** 會訪問工程自有的靜態(tài)資源目錄。
請根據(jù)你的實際需求修改路徑和處理邏輯,并將以上配置類添加到對應(yīng)的組件和工程中。這樣,你就可以在不影響彼此的情況下,分別管理和訪問各自的靜態(tài)資源。
問題小結(jié)
最終發(fā)現(xiàn)是在應(yīng)用組件中做了下面幾件事導(dǎo)致異常一直不斷:
1.組件內(nèi)自定義了靜態(tài)資源處理器
2.組件內(nèi)自定義靜態(tài)資源處理器時是通過集成org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport實現(xiàn)得,沒有通過實現(xiàn)接口org.springframework.web.servlet.config.annotation.WebMvcConfigurer來實現(xiàn)。
3.配置靜態(tài)資源處理器時寫法上不一致,本應(yīng)該是
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/test/**")
.addResourceLocations("classpath:/ui/test/");
}而寫成了
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/test/**")
.addResourceLocations("classpath:/ui/")
.addResourceLocations("file:" + filePath)
.setCachePeriod(3600);
}到此這篇關(guān)于springboot應(yīng)用中靜態(tài)資源訪問與接口請求沖突的文章就介紹到這了,更多相關(guān)springboot靜態(tài)資源訪問與接口請求沖突內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot設(shè)置加載靜態(tài)資源的路徑(spring.resources.static-locations)
- SpringBoot中的static靜態(tài)資源訪問、參數(shù)配置、代碼自定義訪問規(guī)則詳解
- springboot攔截器不攔截靜態(tài)資源,只攔截controller的實現(xiàn)方法
- 關(guān)于SpringBoot攔截器攔截靜態(tài)資源的問題
- SpringBoot2.x過后static下的靜態(tài)資源無法訪問的問題
- SpringBoot如何訪問html和js等靜態(tài)資源配置
- springboot+thymeleaf打包成jar后找不到靜態(tài)資源的坑及解決
- SpringBoot無法訪問/static下靜態(tài)資源的解決
- SpringBoot靜態(tài)資源及原理解析
相關(guān)文章
在Java中Collection的一些常用方法總結(jié)
今天給大家?guī)淼闹R是關(guān)于Java的,文章圍繞著Java中Collection的一些常用方法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
簡單易懂的java8新特性之lambda表達(dá)式知識總結(jié)
一直想針對lambda表達(dá)式作一個總結(jié),借助于這次公司安排的考試作一個入門式的總結(jié),對正在學(xué)習(xí)java的小伙伴們非常有幫助,需要的朋友可以參考下2021-05-05

