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.