Poslužite statične resurse s proljećem
1. Pregled
Ovaj članak istražuje kako poslužuju statičke resurse s Springom - koristeći XML i Java konfiguraciju.
2. Korištenje Spring Boota
Spring Boot dolazi s unaprijed konfiguriranom implementacijom ResourceHttpRequestHandler kako bi se olakšalo posluživanje statičkih izvora.
Prema zadanim postavkama, ovaj rukovatelj poslužuje statički sadržaj s bilo kojeg od / static, / public, / resources, i / META-INF / resursi direktoriji koji se nalaze na putu predavanja. Od src / glavni / resursi obično je na putu prema razredu, tamo možemo smjestiti bilo koji od ovih direktorija.
Na primjer, ako stavimo oko.html datoteka unutar /statički u našem direktoriju u našoj klasi, tada toj datoteci možemo pristupiti putem //localhost:8080/about.html. Slično tome, isti rezultat možemo postići dodavanjem te datoteke u druge spomenute direktorije.
2.1. Prilagođeni obrasci puta
Prema zadanim postavkama Spring Boot poslužuje sav statički sadržaj u korijenskom dijelu zahtjeva, tj. /**. Iako se čini da je to dobra zadana konfiguracija, možemo ga promijeniti putem proljeće.mvc.static-path-pattern svojstvo konfiguracije.
Na primjer, ako želimo pristupiti istoj datoteci putem //localhost:8080/content/about.html, to možemo reći i u našem svojstva.svojstva:
spring.mvc.static-path-pattern = / content / **
U WebFlux okruženjima trebali bismo koristiti proljeće.webflux.static-path-pattern imovine.
2.2. Prilagođeni direktoriji
Slično obrascima puta, također je moguće promijeniti zadane lokacije resursa putem proljeće.izvori.statički-lokacije svojstvo konfiguracije. Ovo svojstvo može prihvatiti više lokacija resursa odvojenih zarezom:
spring.resources.static-locations = classpath: / files /, classpath: / static-files
Ovdje poslužujemo statički sadržaj s / datoteke i / static-datoteke direktoriji unutar puta predavanja. Štoviše, Spring Boot može posluživati statičke datoteke izvan puta predavanja:
spring.resources.static-locations = datoteka: / opt / files
Ovdje koristimo potpis izvora datoteke, datoteka:/, za posluživanje datoteka s našeg lokalnog diska.
3. XML konfiguracija
Ako trebate ići na stari način s konfiguracijom koja se temelji na XML-u, možete dobro iskoristiti mvc: resursi element koji ukazuje na mjesto resursa s određenim uzorkom javnog URL-a.
Na primjer - sljedeći će redak poslužiti svim zahtjevima za resurse koji dolaze s javnim URL uzorkom poput "/resursi/**"Pretraživanjem u" /resursi/Direktorij ispod korijenske mape u našoj aplikaciji.
Sada možemo pristupiti CSS datoteci kao na sljedećoj HTML stranici:
Primjer 3.1.
Dom
4. The ResourceHttpRequestHandler
Proljeće 3.1. uveo ResourceHandlerRegistry za konfiguriranje ResourceHttpRequestHandlers za posluživanje statičkih resursa iz staze razreda, WAR-a ili datotečnog sustava. Možemo konfigurirati ResourceHandlerRegistry programski unutar klase konfiguracije web konteksta.
4.1. Posluživanje resursa pohranjenog u RATU
Da bismo to ilustrirali, upotrijebit ćemo isti URL kao i prije kako bismo na njega ukazivali myCss.css, ali sada će se stvarna datoteka nalaziti u RATOVIMA webapp / resursi mapu, u koju treba smjestiti statičke resurse prilikom postavljanja aplikacija Spring 3.1+:
Primjer 4.1.1.
@Configuration @EnableWebMvc javna klasa MvcConfig implementira WebMvcConfigurer {@Override public void addResourceHandlers (Registry ResourceHandlerRegistry) {registry .addResourceHandler ("/ resources / **") .addResourceLocations (")" }}
Analizirajmo primjer bita. Prvo konfiguriramo put URI-a okrenut prema van dodavanjem definiranja voditelja resursa. Zatim mapiramo taj put URI-a okrenut prema van iznutra na fizički put na kojem se resursi zapravo nalaze.
Naravno, možemo definirati više rukovatelja resursima pomoću ovog jednostavnog, ali fleksibilnog API-ja.
Sada - sljedeći redak u html stranica dobila bi nas myCss.css resurs unutar webapp / resursi imenik:
4.2. Posluživanje resursa pohranjenog u datotečnom sustavu
Recimo da želimo poslužiti resurs pohranjen u / opt / files / direktorija kad god dođe zahtjev za javnim URL-om koji se podudara s uzorkom: / files / **. Jednostavno konfiguriramo uzorak URL-a i preslikavamo ga na to određeno mjesto na disku:
Primjer 4.2.1.
@Override public void addResourceHandlers (Registry ResourceHandlerRegistry) {registry .addResourceHandler ("/ files / **") .addResourceLocations ("file: / opt / files /"); }
* (Za korisnike Windowsa: Argument proslijeđen na addResourceLocations za ovaj bi primjer bio "datoteka: /// C: / opt / files /“).
Jednom kada konfiguriramo mjesto resursa, možemo koristiti mapirani uzorak URL-a u našem home.html do učitavanje slike pohranjene u datotečnom sustavu kako slijedi:
Primjer 4.2.2.
Dom ![]()
4.3. Konfiguriranje više lokacija za resurs
Što ako resurs želimo potražiti na više mjesta?
Možemo uključiti više lokacija s addResourceLocations metoda. Popis lokacija pretraživat će se redom dok se resurs ne pronađe. Pogledajmo primjer 3.3.1.
Primjer 4.3.1
@Override public void addResourceHandlers (Registry ResourceHandlerRegistry) {registry .addResourceHandler ("/ resources / **") .addResourceLocations ("/ resources /", "classpath: / other-resources /"); }
Sljedeći zahtjev za uvijanjem prikazat će Pozdrav.html stranica pohranjena u bilo kojoj aplikaciji webappp / resursi ili drugi-resursi mapa u stazi.
curl -i //localhost:8080/handling-spring-static-resources/resources/Hello.html
5. Novo ResourceResolvers
Proljeće 4.1. pruža - s novim ResourcesResolvers - različite vrste rezolutora resursa koji se mogu koristiti za optimizaciju performansi preglednika prilikom učitavanja statičkih resursa. Ovi razlučivači mogu se povezati lancima i predmemorirati u pregledniku radi optimizacije rukovanja zahtjevima.
5.1. The PathResourceResolver
Ovo je najjednostavniji rješivač, a svrha mu je pronaći resurs s javnim URL uzorkom. Zapravo, ako nije ResourceResolver dodaje se u ResourceChainRegistration, ovo je zadani rješivač.
Pogledajmo primjer:
@Override public void addResourceHandlers (Registry ResourceHandlerRegistry) {registry .addResourceHandler ("/ resources / **") .addResourceLocations ("/ resources /", "/ other-resources /") .setCachePeriod (3600) .resourceChain (true) .resourceChain (true). addResolver (novi PathResourceResolver ()); }
Stvari koje treba primijetiti:
- Registriramo PathResourceResolver u lancu resursa kao jedini ResourceResolver u tome. Pogledajte odjeljak 4.3. kako bi provjerili kako povezati više njih ResourceResolver.
- Resursi koji se poslužuju bit će predmemorirani u pregledniku 3600 sekundi.
- Lanac je konačno konfiguriran metodom resourceChain (istina).
Sada - HTML kôd koji, zajedno s PathResourceResolver, pronalazi foo.js skriptu u bilo kojem webapp / resursi od webapp / ostali resursi mapa:
5.2. The EncodedResourceResolver
Ovaj razrješivač pokušava pronaći kodirani resurs na temelju Prihvati-kodiraj vrijednost zaglavlja zahtjeva.
Na primjer, možda ćemo trebati optimizirati širinu pojasa posluživanjem komprimirane verzije statičkog resursa gzip kodiranje sadržaja.
Da biste konfigurirali EncodedResourceResolver, samo ga moramo konfigurirati u Lanac resursa baš kao što smo konfigurirali PathResourceResolver, kao u sljedećem retku koda:
registra .addResourceHandler ("/ other-files / **") .addResourceLocations ("datoteka: / Users / Me /") .setCachePeriod (3600) .resourceChain (true) .addResolver (novi EncodedResourceResolver ());
Prema zadanim postavkama EncodedResourceResolver je konfiguriran za podršku br i gzip kodiranja.
Dakle, sljedeće kovrča Zahtjev će dobiti zip verziju Početna.html datoteka smještena u datotečnom sustavu u Korisnici / Ja / imenik:
curl -H "Accept-Encoding: gzip" //localhost:8080/handling-spring-static-resources/other-files/Hello.html
Primijetite kako postavljamo zaglavlje "Prihvati-kodiraj”Vrijednost do gzip - ovo je važno jer će se ovaj određivač aktivirati samo ako je gzip sadržaj valjan za odgovor.
Na kraju, imajte na umu da će, kao i prije, komprimirana verzija ostati dostupna tijekom vremenskog razdoblja kada je predmemorirana u pregledniku - što u ovom slučaju iznosi 3600 sekundi.
5.3. Ulančavanje ResourceResolvers
Da biste optimizirali traženje resursa, ResourceResolvers može delegirati rukovanje resursima drugim rješavačima. Jedini rješivač koji ne može delegirati u lanac je PathResourceResolver koje treba dodati na kraju lanca.
Zapravo, ako je lanac resursa nije postavljeno na pravi, tada po defaultu samo a PathResourceResolver koristit će se za opsluživanje resursa. U primjeru 4.3.1. mi lancujemo PathResourceResolver za rješavanje resursa ako GzipResourceResolver je neuspješan.
Primjer 5.3.1.
@Override public void addResourceHandlers (Registry ResourceHandlerRegistry) {registry .addResourceHandler ("/ js / **") .addResourceLocations ("/ js /") .setCachePeriod (3600) .resourceChain (true) .addResol (true) .addResol. addResolver (novi PathResourceResolver ()); }
Sad kad smo dodali / js / ** obrazac za ResourceHandler, uključimo foo.js resurs smješten u webapp / js / imenik u našem home.html stranica kao u primjeru 4.3.2.
Primjer 5.3.2.
Dom ![]()
Vrijedno je spomenuti da, od Spring Framework 5.1, GzipResourceResolver je zastarjelo u korist EncodedResourceResolver. Stoga bismo ga trebali izbjegavati koristiti u budućnosti.
6. Dodatna sigurnosna konfiguracija
Ako koristite Spring Security - važno je omogućiti pristup statičkim resursima. Trebat ćemo dodati odgovarajuća dopuštenja za pristup URL-u resursa:
7. Zaključak
U ovom smo članku ilustrirali razne načine na koje Spring aplikacija može služiti statičkim resursima.
Konfiguracija resursa temeljena na XML-u je opcija "naslijeđa" koje možemo koristiti ako još ne možemo krenuti Java konfiguracijskim putem.
Proljeće 3.1. izašao sa osnovna programska alternativa kroz svoj ResourceHandlerRegistry objekt.
I na kraju - novo iz kutije ResourceResolvers i ResourceChainRegistration objekt isporučeno s proljećem 4.1. nude značajke optimizacije učitavanja resursa poput predmemoriranja i lanca rukovatelja resursima kako bi poboljšali učinkovitost u posluživanju statičkih resursa.
Kao i uvijek, cjelovit primjer dostupan je na Githubu. Osim toga, izvorni kodovi povezani s Spring Bootom također su dostupni u ovom projektu.