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