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.