[JAVA] Geben Sie die statische Ressourcencodierung in Spring Boot an

Spring Boot kann statische Ressourcen hosten (https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot- Es gibt Features-Spring-MVC-Static-Content), aber im Gegensatz zur Antwort des Controllers war ich süchtig danach, Content-Type im Antwortheader der statischen Ressource keinen Zeichensatz zu geben.

Erwarteter Antwortheader


Content-Type: text/html;charset=UTF-8

Tatsächlicher Antwortheader


Content-Type: text/html

Bestätigungsumgebung

Fazit

Sie können die Codierung für Dateien mit bestimmten Erweiterungen angeben, indem Sie WebServerFactoryCustomizer implementieren, um das Verhalten des integrierten Tomcat-Containers anzupassen. Dies ist jedoch nur möglich, wenn der Zeichensatz für die Erweiterung eindeutig festgelegt ist.

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.MimeMappings;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

@Component
public class ServletCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT);
        mappings.add("html", "text/html;charset=UTF-8");
        factory.setMimeMappings(mappings);
    }
}

Bot Plan

Ich werde ein paar Ideen hinterlassen, die ich ausprobiert habe, bevor ich hier bin.

1. Passen Sie den CharacterEncodingFilter an

Durch Anpassen der Einstellung von application.properties kann das Verhalten von CharacterEncodingFilter geändert werden. Sie können es ändern und die Ausgabe des Zeichensatzes erzwingen.

application.properties


# Charset of HTTP requests and responses. 
spring.http.encoding.charset=UTF-8
# Whether to force the encoding to the configured charset on HTTP responses.
spring.http.encoding.force-response=true

Es funktioniert wie erwartet für HTML-Dateien, aber wie der Name schon sagt, wird es zwangsweise zu Bilddateien usw. hinzugefügt, was eine Schande ist.

Content-Type: image/jpeg;charset=UTF-8

2. Erweiterung von CharacterEncodingFilter

CharacterEncodingFilter gibt gleichmäßig aus, daher scheint es gut, diese Klasse abzuleiten und einen eigenen Filter zu implementieren.

Auf den ersten Blick scheint es zu funktionieren, aber diese Methode ist auf Fälle beschränkt, in denen sie anhand der Anforderungs-URL eindeutig bestimmt werden kann.

Wenn Sie index.html als Fallback-Seite zurückgeben und der Pfad nicht aufgelöst werden kann (wie in meinem Fall), enthält die Anforderungs-URL nicht unbedingt die Erweiterung. Dies ist nicht immer der Fall, daher sind die für das Urteil erforderlichen Informationen unzureichend.

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**/*")
            .addResourceLocations("classpath:/static/")
            .resourceChain(true)
            .addResolver(new PathResourceResolver() {
                @Override
                protected Resource getResource(String resourcePath, Resource location) throws IOException {
                    Resource requestedResource = location.createRelative(resourcePath);
                    return requestedResource.exists() && requestedResource.isReadable()
                        ? requestedResource : new ClassPathResource("/static/index.html");
                }
            });
    }
}

Referenzinformationen

Recommended Posts

Geben Sie die statische Ressourcencodierung in Spring Boot an
Geben Sie spring.profiles.active über context-param in web.xml in Spring Boot an
Rufen Sie in Spring Boot eine Proxy-Instanz der Komponente selbst ab
Statische Dateizugriffspriorität beim Spring Boot
Schritte zum Ausführen von Spring Boot beziehen sich auf die Werte in der Eigenschaftendatei
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
Zeigen Sie die Gradle-Aufgabe im Spring Boot-Projekt an
Organisieren Sie die Unterschiede im Verhalten von @NotBlank, @NotEmpty und @NotNull mit Spring Boot + Thymeleaf
Rufen Sie den in der Controller-Klasse von Spring Boot definierten Pfad als Liste ab
Ressourcenhandler-Einstellungen bei der Bereitstellung von SPA mit der statischen Ressourcenfunktion von Spring Boot
So legen Sie Umgebungsvariablen in der Eigenschaftendatei der Spring-Boot-Anwendung fest
Holen Sie sich im Frühjahr mehrere Ressourcen, die dem Muster entsprechen
Untersuchte asynchrone Ausführung von Abfragen in Spring Boot 1.5.9
[Für Anfänger] DI ~ Die Grundlagen von DI und DI im Frühjahr ~
Greifen Sie mit jdbcTemplate auf das integrierte h2db des Spring Boot zu
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Verwendung von CommandLineRunner im Spring Batch von Spring Boot
Überprüfen Sie das Verhalten von getOne-, findById- und Abfragemethoden mit Spring Boot + Spring Data JPA
Legen Sie den Kontextparameter in Spring Boot fest
Spring Boot 2 Multiprojekt mit Gradle
Wichtige Änderungen in Spring Boot 1.5
NoHttpResponseException in Spring Boot + WireMock
Spring Boot 1.x wird im nächsten Jahr EOL erreichen.
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
Über die Funktion von Spring Boot aufgrund unterschiedlicher Versionen
Eine kurze Erklärung der fünf Arten von Java Static
Fügen Sie die Datei in die Eigenschaften eines Strings mit Spring XML-Konfiguration ein
Beschleunigen Sie das Testen von Validatoren, für die DI im Spring Boot erforderlich ist
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
Statische Ressourcen konnten nicht über WebFlux verteilt werden, als @EnableWebFlux in Spring Boot gewährt wurde
Verzweigungsverarbeitung mit dem Rückgabewert von RestTemplate und dem Statuscode von ResponseEntity in Spring Boot
Frühlingsstiefel Hallo Welt in Eclipse
Spring Boot-Anwendungsentwicklung in Eclipse
Memorandum beim Spring Boot 1.5.10 → Spring Boot 2.0.0
Spring Boot zum ersten Mal
Beispielcode, der die Moustache-Vorlagen-Engine mit Spring Boot verwendet
Schreiben Sie den Testcode mit Spring Boot
Geben Sie den Java-Speicherort in eclipse.ini an
Siehe das relative Umleitungsverhalten mit der Einstellung server.tomcat.use-relative-redirects in Spring Boot
Nachricht erlöschen (Spring Boot)
Was ich bei der Migration von der Spring Boot 1.4-Serie zur 2.0-Serie getan habe
Implementieren Sie die REST-API mit Spring Boot
Was ist @Autowired im Spring Boot?
Die Frühjahrsvalidierung war in der Reihenfolge von Form und BindingResult wichtig
Implementieren Sie die Spring Boot-Anwendung in Gradle
Was ich bei der Migration von der Spring Boot 1.5-Serie zur 2.0-Serie getan habe
Sehen Sie sich das Verhalten von Entitätsaktualisierungen mit Spring Boot + Spring Data JPA an
Ich möchte die Standardfehlermeldung von Spring Boot steuern
[Spring Boot] Bis @Autowired in der Testklasse [JUnit5] ausgeführt wird
Formular, das den Wert des sich wiederholenden Elements in Spring MVC erhält
Reihenfolge der Verarbeitung im Programm
Ich möchte die Methode des Controllers kennen, bei der die Ausnahme im ExceptionHandler von Spring Boot ausgelöst wurde
Verwendung von Thymeleaf mit Spring Boot
Filtern Sie das Ergebnis von BindingResult [Spring]
Unbekannter Fehler in Zeile 1 von pom.xml bei Verwendung von Spring Boot in Eclipse
Koexistenz von Flyway in der eingebetteten Datenbank (h2) der Entwicklungsumgebung und der Release-Datenbank (SQL Server) mit Spring Boot
[Spring Boot] Liste der Validierungsregeln, die in der Eigenschaftendatei für Fehlermeldungen verwendet werden können
[Spring Boot] Ich habe untersucht, wie die Nachbearbeitung der empfangenen Anforderung implementiert werden kann.