Statikus erőforrások kiszolgálása tavasszal
1. Áttekintés
Ez a cikk azt vizsgálja, hogyan lehet statikus erőforrásokat szolgáljon a Tavasszal - mind XML, mind Java konfigurációval.
2. A Spring Boot használata
A Spring Boot előre konfigurált megvalósítással érkezik ResourceHttpRequestHandler a statikus erőforrások kiszolgálásának megkönnyítése érdekében.
Alapértelmezés szerint ez a kezelő statikus tartalmat szolgáltat bármelyikből / static, / public, / resources, és / META-INF / források könyvtárak, amelyek az osztályúton vannak. Mivel src / main / resources alapértelmezés szerint általában az classpath-on található, ezeknek a könyvtáraknak bármelyikét elhelyezhetjük.
Például, ha egy about.html fájl a /statikus könyvtárat az osztályúton, akkor a fájlon keresztül elérhetjük //localhost:8080/about.html. Hasonlóképpen ugyanazt az eredményt érhetjük el, ha a fájlt hozzáadjuk más említett könyvtárakhoz.
2.1. Egyéni útvonalminták
Alapértelmezés szerint a Spring Boot az összes statikus tartalmat kiszolgálja a kérelem gyökér része alatt, vagyis /**. Annak ellenére, hogy jó alapértelmezett konfigurációnak tűnik, megváltoztathatjuk a tavasz.mvc.static-path-pattern konfigurációs tulajdonság.
Például, ha ugyanazt a fájlt szeretnénk elérni a //localhost:8080/content/about.html, mondhatjuk a mi application.properties:
tavasz.mvc.static-path-pattern = / content / **
WebFlux környezetekben a tavasz.webflux.static-path-pattern ingatlan.
2.2. Egyéni könyvtárak
Hasonló az útvonalmintákhoz, az alapértelmezett erőforrás-helyek megváltoztatása a tavasz.források.statikus-helyek konfigurációs tulajdonság. Ez a tulajdonság több vesszővel elválasztott erőforrás-helyet is elfogadhat:
spring.resources.static-locations = classpath: / fájlok /, classpath: / static-files
Itt statikus tartalmakat szolgálunk ki a / fájlok és / static-files könyvtárakat az osztályúton belül. Ráadásul, A Spring Boot statikus fájlokat képes kiszolgálni az osztályútvonalon kívülről:
spring.resources.static-locations = fájl: / opt / fájlok
Itt a fájl erőforrás aláírását használjuk, fájl: /, a fájlok kiszolgálására a helyi lemezünkről.
3. XML konfiguráció
Ha az XML-alapú konfigurációval a régi módon kell haladnia, akkor jól használhatja a mvc: források elem, amely az erőforrások helyére mutat egy adott nyilvános URL-mintával.
Például - a következő sor minden olyan erőforrás-kérelmet kiszolgál, amely nyilvános URL-mintával érkezik, például:/erőforrások/**”Keresésével a„ /erőforrások/”Könyvtárat az alkalmazásunk gyökérmappája alatt.
Most elérhetünk egy CSS-fájlt a következő HTML oldalon található módon:
3.1. Példa
itthon
4. A ResourceHttpRequestHandler
Tavasz 3.1. bemutatta a ResourceHandlerRegistry konfigurálásához ResourceHttpRequestHandlers statikus erőforrások kiszolgálására az osztályútvonalról, a WAR-ból vagy a fájlrendszerből. Beállíthatjuk a ResourceHandlerRegistry programozottan a webkontextus konfigurációs osztályunkon belül.
4.1. A WAR-ban tárolt erőforrás kiszolgálása
Ennek szemléltetésére ugyanazt az URL-t fogjuk használni, mint korábban myCss.css, de most a tényleges fájl a WAR-okban lesz webapp / források mappa, ahová statikus erőforrásokat kell elhelyezni a Spring 3.1+ alkalmazások telepítésekor:
4.1.1. Példa
@Configuration @EnableWebMvc public class MvcConfig implementálja a WebMvcConfigurer {@Orride public void addResourceHandlers (ResourceHandlerRegistry registry) {register .addResourceHandler ("/ resources / **") .addResourceLocations ("/ resources /"); }}
Elemezzük a példa bitet. Először egy erőforrás-kezelő definiálásával konfiguráljuk a külső URI elérési utat. Ezután azt a külső URI elérési utat belsőleg feltérképezzük a fizikai útra, ahol az erőforrások valójában találhatók.
Természetesen több erőforrás-kezelőt is meghatározhatunk ennek az egyszerű, ugyanakkor rugalmas API-nak a használatával.
Most - a következő sor egy html oldal megszerezné nekünk a myCss.css erőforrás a webapp / források Könyvtár:
4.2. A fájlrendszerben tárolt erőforrás kiszolgálása
Tegyük fel, hogy a / opt / files / könyvtár, amikor a mintának megfelelő nyilvános URL-re kérés érkezik: / fájlok / **. Egyszerűen konfiguráljuk az URL-mintát és hozzárendeljük a lemez adott helyéhez:
4.2.1. Példa
@Orride public void addResourceHandlers (ResourceHandlerRegistry registry) {register .addResourceHandler ("/ files / **") .addResourceLocations ("file: / opt / files /"); }
* (Windows felhasználók számára: Az argumentum átadva addResourceLocations ez a példa a következő lenne:fájl: /// C: / opt / fájlok /“).
Miután konfiguráltuk az erőforrás helyét, használhatjuk a leképezett URL-mintát home.html nak nek töltse be a fájlrendszerben tárolt képet alábbiak szerint:
4.2.2. Példa
itthon
4.3. Több hely beállítása egy erőforráshoz
Mi van, ha több helyen akarunk erőforrást keresni?
Több helyet is felvehetünk a addResourceLocations módszer. A helyek listájában sorrendben keresnek, amíg meg nem találja az erőforrást. Vessünk egy pillantást a 3.3.1 példára.
4.3.1. Példa
@Orride public void addResourceHandlers (ResourceHandlerRegistry registry) {register .addResourceHandler ("/ resources / **") .addResourceLocations ("/ resources /", "classpath: / other-resources /"); }
A következő göndör kérés megjeleníti a Hello.html az alkalmazás bármelyikében tárolt oldal webappp / források vagy a egyéb források mappa az osztályútvonalon.
göndör -i //localhost:8080/handling-spring-static-resources/resources/Hello.html
5. Az Új ResourceResolvers
Tavasz 4.1. biztosítja - az új ResourcesResolvers - különböző típusú erőforrás-felbontók, amelyek felhasználhatók a böngésző teljesítményének optimalizálására statikus erőforrások betöltésekor. Ezeket a megoldókat láncolhatja és gyorsítótárba helyezheti a böngészőben a kérelemkezelés optimalizálása érdekében.
5.1. A PathResourceResolver
Ez a legegyszerűbb megoldó, amelynek célja egy nyilvános URL-mintát kapott erőforrás megkeresése. Valójában, ha nem ResourceResolver hozzáadódik a ResourceChainRegistration, ez az alapértelmezett felbontó.
Lássunk egy példát:
@Orride public void addResourceHandlers (ResourceHandlerRegistry registry) {register .addResourceHandler ("/ resources / **") .addResourceLocations ("/ resources /", "/ other-resources /") .setCachePeriod (3600) .resourceChain (true). addResolver (új PathResourceResolver ()); }
Figyelemre méltó dolgok:
- Regisztráljuk a PathResourceResolver az erőforrásláncban egyedüli ResourceResolver benne. Lásd a 4.3 szakaszt. hogy ellenőrizze, hogyan lehet többet láncolni ResourceResolver.
- A kiszolgált erőforrásokat a böngésző tárolja 3600 másodpercig.
- A lánc végül konfigurálva van a módszerrel resourceChain (true).
Most - a HTML kód, amely a PathResourceResolver, megkeresi a foo.js szkriptet a webapp / források a webapp / egyéb források mappa:
5.2. A EncodedResourceResolver
Ez a megoldó megkísérli megtalálni a kódolt erőforrást a Elfogadás-kódolás kérés fejléc értéke.
Például optimalizálnunk kell a sávszélességet egy statikus erőforrás tömörített verziójának kiszolgálásával gzip tartalom kódolása.
An konfigurálásához EncodedResourceResolver, csak be kell állítanunk a ResourceChain ahogy konfiguráltuk a PathResourceResolver, mint a következő kódsorban:
nyilvántartás .addResourceHandler ("/ other-files / **") .addResourceLocations ("file: / Users / Me /") .setCachePeriod (3600) .resourceChain (true) .addResolver (new EncodedResourceResolver ());
Alapértelmezés szerint a EncodedResourceResolver támogatásra van konfigurálva br és gzip kódolások.
Tehát a következők becsavar kérés megkapja a .zip verzióját Home.html fájl a fájlrendszerben található Felhasználók / Én / Könyvtár:
curl -H "Elfogadás-kódolás: gzip" //localhost:8080/handling-spring-static-resources/other-files/Hello.html
Figyelje meg, hogyan beállítjuk a fejlécElfogadás-kódolás”Értéke gzip - ez azért fontos, mert ez a bizonyos felbontó csak akkor indul be, ha a gzip tartalom érvényes a válaszra.
Végül vegye figyelembe, hogy a tömörített verzió a korábbiakhoz hasonlóan elérhető marad a böngészőben tárolt időtartamig - ez ebben az esetben 3600 másodperc.
5.3. Láncolás ResourceResolvers
Az erőforrás-keresés optimalizálásához ResourceResolvers átruházhatja az erőforrások kezelését más megoldókra. Az egyetlen megoldó, amely nem delegálhatja a láncot, az PathResourceResolver amelyet hozzá kell adni a lánc végén.
Valójában, ha a resourceChain nincs beállítva igaz, akkor alapértelmezés szerint csak a PathResourceResolver források kiszolgálására fogják felhasználni. A 4.3.1 példában. láncoljuk a PathResourceResolver az erőforrás feloldásához, ha a GzipResourceResolver sikertelen.
5.3.1. Példa
@Orride public void addResourceHandlers (ResourceHandlerRegistry registry) {register .addResourceHandler ("/ js / **") .addResourceLocations ("/ js /") .setCachePeriod (3600) .resourceChain (true) .addResolver (new GzipRes). addResolver (új PathResourceResolver ()); }
Most, hogy hozzáadtuk a / js / ** mintát a ResourceHandler, tegyük bele a foo.js forrás található a webapp / js / könyvtár a mi home.html oldal a 4.3.2. példa szerint.
5.3.2. Példa
itthon
Érdemes megemlíteni, hogy a Spring Framework 5.1-től kezdve az GzipResourceResolver már elavult a EncodedResourceResolver. Ezért a jövőben kerülnünk kell a használatát.
6. További biztonsági konfiguráció
A Spring Security használata esetén fontos engedélyezni a statikus erőforrásokhoz való hozzáférést. Hozzá kell adnunk a megfelelő engedélyeket az erőforrás URL eléréséhez:
7. Következtetés
Ebben a cikkben különféle módszereket szemléltettünk, amelyek segítségével a Spring alkalmazás statikus erőforrásokat szolgálhat ki.
Az XML-alapú erőforrás-konfiguráció „örökölt” opció amelyet akkor használhatunk, ha még nem tudunk lefelé menni a Java konfigurációs útvonalon.
Tavasz 3.1. kijött alapvető programozási alternatíva azon keresztül ResourceHandlerRegistry tárgy.
És végül - az új a dobozból ResourceResolvers és ResourceChainRegistration tárgy 4.1 rugóval szállítva. erőforrás-betöltési optimalizálási funkciókat kínál, mint például a gyorsítótár és az erőforrás-kezelő láncolás a statikus erőforrások kiszolgálásának hatékonyságának javítása érdekében.
Mint mindig, a teljes példa elérhető a Github oldalon. Ezenkívül a Spring Boot kapcsolódó forráskódjai is rendelkezésre állnak ebben a projektben.