springboot應用中靜態(tài)資源訪問與接口請求沖突問題解決
詭異得問題總是難以避免,發(fā)生了就有必要把經(jīng)驗留下來。在開發(fā)過程中很少見過當靜態(tài)資源請求路徑與接口請求路徑前綴重疊得情況下發(fā)生異常,但就是遇到了:請求/hello/test.js /hello/testxxxx等路徑 卻能進入到接口/hello/test對應的方法內(nèi)。遇到這樣得問題應該怎么辦呢?本文通過以下幾個串起來得問題分享一下經(jīng)驗。
問題一:“springboot js文件請求路徑 會被controller接收到”
在 Spring Boot 中,默認情況下,靜態(tài)資源文件(如 JavaScript 文件)的請求路徑不會被交由 Controller 處理。Spring Boot 的自動配置會將靜態(tài)資源的請求路徑與靜態(tài)資源文件夾進行映射,以直接返回對應的靜態(tài)資源文件,而不經(jīng)過 Controller。
默認情況下,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 默認的靜態(tài)資源文件夾中(如 static 文件夾)。如果你將靜態(tài)資源文件放置在其他位置,可能會導致請求被 Controller 接收到。
- 配置了自定義的靜態(tài)資源處理器:如果你在 Spring Boot 中配置了自定義的靜態(tài)資源處理器,可能會導致請求被 Controller 接收到。請檢查你的配置,確保不會覆蓋默認的靜態(tài)資源處理器。
- 路徑匹配問題:請確保你的 JavaScript 文件的請求路徑與實際文件的相對路徑匹配。如果路徑不匹配,可能會導致請求被交由 Controller 處理。
請檢查以上可能的原因,并根據(jù)具體情況進行調(diào)整。確保靜態(tài)資源文件的位置正確,并且請求路徑與實際文件的相對路徑匹配。這樣,請求就應該會直接返回對應的靜態(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
對象進行配置。
- addResourceHandler("/custom/**") 指定了靜態(tài)資源的 URL 路徑模式,這里是 /custom/**。
- addResourceLocations("classpath:/custom/") 指定了靜態(tài)資源文件的存放位置,這里是 classpath:/custom/,即 classpath 下的 custom 目錄。
- setCachePeriod(3600) 設置了靜態(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ā)得應用組件內(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ù)你的實際需求修改路徑和處理邏輯,并將以上配置類添加到對應的組件和工程中。這樣,你就可以在不影響彼此的情況下,分別管理和訪問各自的靜態(tài)資源。
問題小結
最終發(fā)現(xiàn)是在應用組件中做了下面幾件事導致異常一直不斷:
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)資源處理器時寫法上不一致,本應該是
@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); }
到此這篇關于springboot應用中靜態(tài)資源訪問與接口請求沖突的文章就介紹到這了,更多相關springboot靜態(tài)資源訪問與接口請求沖突內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- springboot設置加載靜態(tài)資源的路徑(spring.resources.static-locations)
- SpringBoot中的static靜態(tài)資源訪問、參數(shù)配置、代碼自定義訪問規(guī)則詳解
- springboot攔截器不攔截靜態(tài)資源,只攔截controller的實現(xià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)資源及原理解析