[JAVA] Ressourcenhandler-Einstellungen bei der Bereitstellung von SPA mit der statischen Ressourcenfunktion von Spring Boot

Die statische Ressourcenverteilungsfunktion von SpringBoot ist eine sehr praktische Funktion, auf die Sie jedoch nur auf der obersten Seite zugreifen können, wenn Sie den Dateinamen bis zur Erweiterung angeben. Ein allgemeines SPA verfügt über eine Routing-Funktion, die die HTML5-Verlaufs-API verwendet. Während jeder Seite mehrere URLs zugewiesen sind, muss nur index.html vorbereitet werden. Wenn SPA als statische Ressource mit den Standardeinstellungen von Spring Boot bereitgestellt wird, kann die Seite daher nicht korrekt angezeigt werden, wenn direkt auf eine andere Seite als die obere Seite zugegriffen wird oder wenn der Bildschirm aktualisiert wird.

Was Sie erreichen wollen

Wir werden eine Einstellmethode in Betracht ziehen, die die folgenden Anforderungen erfüllt.

Das Vorhandensein oder Fehlen einer Erweiterung wird verwendet, um zu bestimmen, ob das Zugriffsziel eine Seite oder eine Datei ist. Der Zugriff auf eine URL ohne Erweiterung wird als Seitenzugriff betrachtet und gibt index.html zurück.

Problemumgehung 1: Verwenden Sie das Hash-Routing auf der SPA-Seite

Am einfachsten ist es, den Hash-Modus in den Router-Einstellungen auf der SPA-Seite zu verwenden (das folgende Beispiel zeigt Nuxt.js).

js:nuxt.config.js


module.exports = {
  mode: 'spa',
  router: {
    mode: 'hash'
  },
  ......

Unabhängig vom Routing auf der SPA-Seite ist die Anforderung an den Server immer der Zugriff auf die Startseite. Mit den Standardeinstellungen von SpringBoot wird index.html als Antwort als WelcomePage zurückgegeben, sodass alle Seiten-URLs gültig sind.

Problemumgehung 2: Legen Sie die Spring Boot-Anforderungszuordnung fest

Wenn Sie den Verlaufsmodus nicht aufgeben möchten, müssen Sie ihn auf der Spring Boot-Seite konfigurieren.

Informationen zur Bereitstellung statischer Ressourcen mit Standardeinstellungen

Lassen Sie uns zunächst überprüfen, wie die statische Ressourcenverteilung von Spring Boot standardmäßig festgelegt ist.

Die Standardeinstellung ist WebMvcAutoConfiguration.java des Spring-Boot-Autoconfigure-Moduls. -Es wird in (autoconfigure / src / main / java / org / springframework / boot / autoconfigure / web / servlet / WebMvcAutoConfiguration.java) beschrieben. In dieser Klasse wird die Zuordnung für die folgenden statischen Ressourcen festgelegt.

Wenn Sie die Protokollstufe von org.springframework.web auf DEBUG setzen, können Sie bestätigen, dass sie in der Protokollausgabe beim Start wie folgt eingestellt ist.

app.log


2018-06-05 23:17:29.654  INFO 18345 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-06-05 23:17:29.655  INFO 18345 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-06-05 23:17:29.732  INFO 18345 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path resource [static/index.html]
2018-06-05 23:17:29.915 DEBUG 18345 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Looking for resource handler mappings
2018-06-05 23:17:29.916 DEBUG 18345 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Found resource handler mapping: URL pattern="/**/favicon.ico", locations=[class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], ServletContext resource [/], class path resource []], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@3b4ef7]
2018-06-05 23:17:29.916 DEBUG 18345 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Found resource handler mapping: URL pattern="/webjars/**", locations=[class path resource [META-INF/resources/webjars/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@1af05b03]
2018-06-05 23:17:29.916 DEBUG 18345 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Found resource handler mapping: URL pattern="/**", locations=[class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], ServletContext resource [/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@5987e932]

Einstellmethode

Ändern Sie das statische Ressourcenzuordnungsmuster

Fügen Sie application.yml eine Einstellung hinzu, um statische Ressourcen nur für Pfade mit Erweiterungen zurückzugeben. Das Standardzuordnungsmuster für statische Ressourcen ist in "spring.mvc.static-path-pattern" definiert und wird überschrieben.

application.yml


spring:
  mvc:
    static-path-pattern: /**/*.*

Fügen Sie einen Ressourcenhandler für die Seiten-URL hinzu

Mit den oben genannten Einstellungen weicht der Zugriff auf die Seiten-URL von den Standardeinstellungen für die Zuordnung des statischen Ressourcenhandlers ab. Definieren Sie daher die folgende Konfiguration mit Bezug auf WebMvcAutoConfiguration.java, damit index.html zurückgegeben wird, wenn die Zielressource für den Zugriff auf die Seiten-URL nicht vorhanden ist.

Html5HistoryModeResourceConfig.java


@Configuration
public class Html5HistoryModeResourceConfig implements WebMvcConfigurer {

    @Autowired
    private ResourceProperties resourceProperties;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
            .addResourceHandler("/**")
            .addResourceLocations(resourceProperties.getStaticLocations())
            .resourceChain(false)
            .addResolver(new SpaPageResourceResolver());
    }

    public static class SpaPageResourceResolver extends PathResourceResolver {
        @Override
        protected Resource getResource(String resourcePath, Resource location) throws IOException {
            Resource resource = super.getResource(resourcePath, location);
            return resource != null ? resource : super.getResource("index.html", location);
        }
    }
}

Da die Standardeinstellungen Vorrang haben, haben wir Ressourcenhandler für alle anderen Pfade festgelegt. Der statische Ressourcenspeicherpfad wird von der ResourceProperties-Instanz abgerufen, sodass die Einstellung "spring.resources.static-location" unverändert verwendet werden kann. Der letzte in "addResolver" registrierte "SpaPageResourceResolver" gibt die Antwort von index.html des Stammpfads zurück.

Wenn die obige Konfigurationsklasse beim Start geladen wird, sollte sie wie unten gezeigt im Startprotokoll angezeigt werden.

app.log


2018-06-05 23:42:22.481  INFO 18576 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-06-05 23:42:22.481  INFO 18576 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/*.*] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-06-05 23:42:22.481  INFO 18576 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-06-05 23:42:22.781 DEBUG 18576 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Looking for resource handler mappings
2018-06-05 23:42:22.782 DEBUG 18576 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Found resource handler mapping: URL pattern="/**/favicon.ico", locations=[class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], ServletContext resource [/], class path resource []], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@1af1347d]
2018-06-05 23:42:22.782 DEBUG 18576 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Found resource handler mapping: URL pattern="/webjars/**", locations=[class path resource [META-INF/resources/webjars/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@632aa1a3]
2018-06-05 23:42:22.782 DEBUG 18576 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Found resource handler mapping: URL pattern="/**/*.*", locations=[class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], ServletContext resource [/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@20765ed5]
2018-06-05 23:42:22.782 DEBUG 18576 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Found resource handler mapping: URL pattern="/**", locations=[class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[com.test.spa.Html5HistoryModeResourceConfig$SpaPageResourceResolver@3b582111]

Zusammenfassung

In Bezug auf die Bereitstellung von SPA denke ich, dass es eine andere bessere Methode gibt, die den Betrieb in vollem Umfang und SSR berücksichtigt. Wenn Sie jedoch die JAR-Datei wie Jenkins alleine starten, wird der Bildschirm mit ihr geliefert. Wenn Sie es schaffen wollen, denke ich, dass diese Einstellung effektiv ist.

Referenzlink

Spring Boot Reference Guide - 27.1.5 Static Content https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-spring-mvc-static-content

Verstehen des Zugriffs auf statische Ressourcen in Spring MVC (+ Spring Boot) -Qiita https://qiita.com/kazuki43zoo/items/e12a72d4ac4de418ee37

Goslings Development Memo-Teil 5: Spring Boot Final (statische Ressourcenverarbeitung) | Noch zu entscheiden https://www.kaitoy.xyz/2017/01/24/goslings-development-memo5-spring-boot-static-resources /.

html5 - Spring Boot with AngularJS html5Mode - Stack Overflow https://stackoverflow.com/questions/24837715/spring-boot-with-angularjs-html5mode

spring - Springboot/Angular2 - How to handle HTML5 urls? - Stack Overflow https://stackoverflow.com/questions/38516667/springboot-angular2-how-to-handle-html5-urls

Recommended Posts

Ressourcenhandler-Einstellungen bei der Bereitstellung von SPA mit der statischen Ressourcenfunktion von Spring Boot
Geben Sie die statische Ressourcencodierung in Spring Boot an
Greifen Sie mit jdbcTemplate auf das integrierte h2db des Spring Boot zu
Über die Funktion von Spring Boot aufgrund unterschiedlicher Versionen
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
Memorandum beim Spring Boot 1.5.10 → Spring Boot 2.0.0
Sehen Sie sich das Verhalten von Entitätsaktualisierungen mit Spring Boot + Spring Data JPA an
So greifen Sie mit der TCP-Funktion von Spring Integration direkt auf Socket zu
Implementieren Sie die Paging-Funktion mit Spring Boot + Thymeleaf
Einführung des Spring Boot Actuator, einer Funktion, die die Bedienung von Spring Boot-Anwendungen erleichtert
Organisieren Sie die Unterschiede im Verhalten von @NotBlank, @NotEmpty und @NotNull mit Spring Boot + Thymeleaf
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Lassen Sie uns das Gefühl von Spring Boot + Swagger 2.0 überprüfen
Wenn @Transactional of Spring Boot nicht funktioniert
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
[Spring Boot] Die Geschichte, dass die Bean der Klasse mit der Annotation ConfigurationProperties nicht gefunden wurde
Beim Hochladen einer Datei mit Spring Boot wird eine Fehlerbehandlung durchgeführt, wenn die maximale Dateigröße überschritten wird.
Einstellungen für die Verbindung zu MySQL mit Spring Boot + Spring JDBC
[Hinweis] Festlegen der Datei bei Verwendung von Logback mit Spring Boot
Feder mit Kotorin ―― 3. Auslassen von Wellenklammern aus der Funktion
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Spring Boot mit Spring Security Filter-Einstellungen und Suchtpunkten
Erstellen Sie Restapi mit Spring Boot (bis zum Ausführen der App)
Eine Übersicht über die Spring Framework Resource-Oberfläche
Booten nach Umgebung mit Spring Boot of Maven
Steuern Sie den Spring Batch-Verarbeitungsablauf mit JavaConfig.
Mit Spring Boot herunterladen
Ändern Sie das Injektionsziel für jede Umgebung mit Spring Boot 2
Schneiden Sie SQL in die Eigenschaftendatei mit jdbcTemplate von Spring Boot aus
Versuchen Sie, die Springcode-Such-API mit Spring Boot aufzurufen
Geben Sie beim Erstellen mit Maven den Zeichencode der Quelle an
Spring Boot-Anwendung, die DB-Verbindungseinstellungen mit Parametern angibt
Einführung der Bibliothek ff4j, die Feature Toggle mit Spring Boot realisiert
Eine Geschichte, die mich bedauerte, als während der Entwicklung der Spring Boot-App eine "NotReadablePropertyException" auftrat.