Serveer statische bronnen met de lente

1. Overzicht

In dit artikel wordt uitgelegd hoe u dit kunt doen bedien statische bronnen met Spring - gebruikmakend van zowel XML- als Java-configuratie.

2. Spring Boot gebruiken

Spring Boot wordt geleverd met een vooraf geconfigureerde implementatie van ResourceHttpRequestHandler om het bedienen van statische bronnen te vergemakkelijken.

Standaard levert deze handler statische inhoud van elk van / static, / public, / resources, en / META-INF / bronnen mappen die zich op het klassenpad bevinden. Sinds src / main / resources staat standaard standaard op het klassenpad, we kunnen elk van deze mappen daar plaatsen.

Als we bijvoorbeeld een about.html bestand in het /statisch directory in ons classpath, dan hebben we toegang tot dat bestand via //localhost:8080/about.html. Op dezelfde manier kunnen we hetzelfde resultaat bereiken door dat bestand toe te voegen aan andere genoemde mappen.

2.1. Aangepaste padpatronen

Standaard levert Spring Boot alle statische inhoud onder het rootgedeelte van het verzoek, dat wil zeggen, /**. Ook al lijkt het een goede standaardconfiguratie te zijn, we kunnen het wijzigen via de spring.mvc.static-path-pattern configuratie-eigenschap.

Als we bijvoorbeeld hetzelfde bestand willen openen via //localhost:8080/content/about.html, we kunnen het zeggen in onze application.properties:

spring.mvc.static-path-pattern = / content / **

In WebFlux-omgevingen moeten we de spring.webflux.static-path-pattern eigendom.

2.2. Aangepaste mappen

Net als bij padpatronen, het is ook mogelijk om de standaard resource-locaties te wijzigen via de spring.resources.static-locations configuratie-eigenschap. Deze eigenschap kan meerdere door komma's gescheiden bronlocaties accepteren:

spring.resources.static-locations = classpath: / files /, classpath: / static-files

Hier serveren we statische inhoud van het / bestanden en / static-bestanden mappen binnen het klassenpad. Bovendien, Spring Boot kan statische bestanden van buiten het klassenpad bedienen:

spring.resources.static-locations = bestand: / opt / files 

Hier gebruiken we de handtekening van de bestandsresource, het dossier:/, om bestanden van onze lokale schijf te serveren.

3. XML-configuratie

Als u op de ouderwetse manier moet gaan met XML-gebaseerde configuratie, kunt u goed gebruik maken van de mvc: bronnen element om te verwijzen naar de locatie van bronnen met een specifiek openbaar URL-patroon.

Bijvoorbeeld: de volgende regel zal alle verzoeken voor bronnen behandelen die binnenkomen met een openbaar URL-patroon zoals '/middelen/**"Door te zoeken in de" /middelen/”Map onder de hoofdmap in onze applicatie.

Nu hebben we toegang tot een CSS-bestand zoals op de volgende HTML-pagina:

Voorbeeld 3.1.

 Huis 

4. Het ResourceHttpRequestHandler

Lente 3.1. introduceerde het ResourceHandlerRegistry configureren ResourceHttpRequestHandlers voor het aanbieden van statische bronnen vanuit het klassenpad, de WAR of het bestandssysteem. We kunnen het ResourceHandlerRegistry programmatisch binnen onze webcontextconfiguratieklasse.

4.1. Dienen van een hulpbron die is opgeslagen in de OORLOG

Om dit te illustreren, gebruiken we dezelfde URL als hiervoor om naar te verwijzen myCss.css, maar nu bevindt het eigenlijke bestand zich in de WAR's webapp / bronnen map, waar statische bronnen moeten worden geplaatst bij het implementeren van Spring 3.1+ applicaties:

Voorbeeld 4.1.1.

@Configuration @EnableWebMvc public class MvcConfig implementeert WebMvcConfigurer {@Override public void addResourceHandlers (ResourceHandlerRegistry-register) {registry .addResourceHandler ("/ resources / **") .addResourceLocations ("/ resources /"); }}

Laten we het voorbeeldbit analyseren. Eerst configureren we het naar buiten gerichte URI-pad door een resource-handler toe te voegen. Vervolgens wijzen we dat naar buiten gerichte URI-pad intern toe aan het fysieke pad waar de bronnen zich daadwerkelijk bevinden.

We kunnen natuurlijk meerdere resource handlers definiëren met behulp van deze eenvoudige maar flexibele API.

Nu - de volgende regel in een html pagina zou ons de myCss.css resource binnen de webapp / bronnen directory:

4.2. Een bron aanbieden die is opgeslagen in het bestandssysteem

Laten we zeggen dat we een bron willen bedienen die is opgeslagen in het / opt / bestanden / directory telkens wanneer een verzoek binnenkomt voor de openbare URL die overeenkomt met het patroon: / bestanden / **. We configureren eenvoudigweg het URL-patroon en wijzen het toe aan die specifieke locatie op schijf:

Voorbeeld 4.2.1.

@Override public void addResourceHandlers (ResourceHandlerRegistry-register) {registry .addResourceHandler ("/ files / **") .addResourceLocations ("file: / opt / files /"); }

* (Voor Windows-gebruikers: het argument is doorgegeven aan addResourceLocations voor dit voorbeeld zou zijn "file: /// C: / opt / files /“).

Zodra we de bronlocatie hebben geconfigureerd, kunnen we het toegewezen URL-patroon gebruiken in onze home.html naar laad een afbeelding die is opgeslagen in het bestandssysteem als volgt:

Voorbeeld 4.2.2.

 Huis 

4.3. Meerdere locaties configureren voor een bron

Wat als we een bron op meer dan één locatie willen zoeken?

We kunnen meerdere locaties opnemen met de addResourceLocations methode. De lijst met locaties wordt op volgorde doorzocht totdat de bron is gevonden. Laten we eens kijken naar voorbeeld 3.3.1.

Voorbeeld 4.3.1

@Override public void addResourceHandlers (ResourceHandlerRegistry-register) {registry .addResourceHandler ("/ resources / **") .addResourceLocations ("/ resources /", "classpath: / other-resources /"); }

Het volgende curl-verzoek zal de Hallo.html pagina opgeslagen in een van beide applicaties webappp / bronnen of de andere bronnen map in het klassenpad.

curl -i //localhost:8080/handling-spring-static-resources/resources/Hello.html

5. Het nieuwe ResourceResolvers

Lente 4.1. biedt - met het nieuwe Bronnen Oplossers - verschillende soorten resource resolvers die kunnen worden gebruikt om de browserprestaties te optimaliseren bij het laden van statische bronnen. Deze resolvers kunnen in de browser worden geketend en in de cache worden opgeslagen om de afhandeling van verzoeken te optimaliseren.

5.1. De PathResourceResolver

Dit is de eenvoudigste resolver en het doel is om een ​​bron te vinden met een openbaar URL-patroon. In feite, zo nee ResourceResolver wordt toegevoegd aan de ResourceChainRegistration, dit is de standaard resolver.

Laten we een voorbeeld bekijken:

@Override public void addResourceHandlers (register ResourceHandlerRegistry) {registry .addResourceHandler ("/ resources / **") .addResourceLocations ("/ resources /", "/ other-resources /") .setCachePeriod (3600) .resourceChain (true). addResolver (nieuwe PathResourceResolver ()); }

Dingen om op te merken:

  • We registreren het PathResourceResolver in de grondstofketen als enige ResourceResolver in het. Zie paragraaf 4.3. om te controleren hoe u meer dan één ketting kunt koppelen ResourceResolver.
  • De aangeboden bronnen worden 3600 seconden in de browser bewaard.
  • De ketting is eindelijk geconfigureerd met de methode resourceChain (true).

Nu - de HTML-code die, in combinatie met de PathResourceResolver, lokaliseert het foo.js script in ofwel het webapp / bronnen van de webapp / andere bronnen map:

5.2. De EncodedResourceResolver

Deze resolver probeert een gecodeerde bron te vinden op basis van het Accepteer codering verzoek header waarde.

Het is bijvoorbeeld mogelijk dat we de bandbreedte moeten optimaliseren door de gecomprimeerde versie van een statische bron te gebruiken met gzip inhoud codering.

Om een EncodedResourceResolver, we hoeven het alleen maar te configureren in de ResourceChain net zoals we het PathResourceResolver, zoals in de volgende regel code:

registry .addResourceHandler ("/ other-files / **") .addResourceLocations ("file: / Users / Me /") .setCachePeriod (3600) .resourceChain (true) .addResolver (nieuw EncodedResourceResolver ());

Standaard is het EncodedResourceResolver is geconfigureerd om te ondersteunen br en gzip coderingen.

Dus het volgende krullen request krijgt de gezipte versie van het Home.html bestand in het bestandssysteem in het Gebruikers / Ik / directory:

curl -H "Accept-Encoding: gzip" //localhost:8080/handling-spring-static-resources/other-files/Hello.html

Merk op hoe we stellen de koptekst "Accepteer codering”Waarde naar gzip - dit is belangrijk omdat deze specifieke resolver alleen wordt geactiveerd als de gzip-inhoud geldig is voor het antwoord.

Merk ten slotte op dat, net als voorheen, de gecomprimeerde versie beschikbaar blijft gedurende de periode dat deze in de cache wordt bewaard in de browser - in dit geval 3600 seconden.

5.3. Keten ResourceResolvers

Om het opzoeken van bronnen te optimaliseren, ResourceResolvers kan de afhandeling van resources delegeren aan andere resolvers. De enige resolver die niet kan delegeren naar de keten is de PathResourceResolver die aan het einde van de ketting moet worden toegevoegd.

Als het resourceChain is niet ingesteld op waar, dan standaard alleen een PathResourceResolver zal worden gebruikt om middelen te dienen. In Voorbeeld 4.3.1. we ketenen de PathResourceResolver om de bron op te lossen als het GzipResourceResolver is niet succesvol.

Voorbeeld 5.3.1.

@Override public void addResourceHandlers (ResourceHandlerRegistry-register) {registry .addResourceHandler ("/ js / **") .addResourceLocations ("/ js /") .setCachePeriod (3600) .resourceChain (true) .addResolver (nieuw). addResolver (nieuwe PathResourceResolver ()); }

Nu we het / js / ** patroon naar de ResourceHandler, laten we de foo.js resource in het webapp / js / directory in onze home.html pagina zoals in Voorbeeld 4.3.2.

Voorbeeld 5.3.2.

 Huis 

Het is vermeldenswaard dat, vanaf Spring Framework 5.1, het GzipResourceResolver is verouderd ten gunste van de EncodedResourceResolver. Daarom moeten we het in de toekomst vermijden.

6. Aanvullende beveiligingsconfiguratie

Als u Spring Security gebruikt, is het belangrijk om toegang tot statische bronnen toe te staan. We moeten de bijbehorende machtigingen toevoegen om toegang te krijgen tot de bron-URL:

7. Conclusie

In dit artikel hebben we verschillende manieren geïllustreerd waarop een Spring-applicatie statische bronnen kan bedienen.

De op XML gebaseerde resourceconfiguratie is een "legacy" -optie die we kunnen gebruiken als we de Java-configuratieroute nog niet kunnen volgen.

Lente 3.1. kwam uit met een basis programmatisch alternatief via zijn ResourceHandlerRegistry voorwerp.

En tot slot - het nieuwe uit de doos ResourceResolvers en ResourceChainRegistration voorwerp geleverd met Spring 4.1. bieden optimalisatiefuncties voor het laden van resources, zoals caching en resource handler chaining, om de efficiëntie bij het bedienen van statische resources te verbeteren.

Zoals altijd is het volledige voorbeeld beschikbaar op Github. Bovendien zijn Spring Boot-gerelateerde broncodes ook beschikbaar in dit project.


$config[zx-auto] not found$config[zx-overlay] not found