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
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);
}
}
Ich werde ein paar Ideen hinterlassen, die ich ausprobiert habe, bevor ich hier bin.
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
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");
}
});
}
}
Recommended Posts