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.
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.
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.
Wenn Sie den Verlaufsmodus nicht aufgeben möchten, müssen Sie ihn auf der Spring Boot-Seite konfigurieren.
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]
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: /**/*.*
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]
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.
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