Spring Boot a la capacité d'héberger des ressources statiques (https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot- Il y a features-spring-mvc-static-content), mais contrairement à la réponse du Controller, j'étais accro à ne pas donner de charset à Content-Type dans l'en-tête de réponse de la ressource statique.
En-tête de réponse attendu
Content-Type: text/html;charset=UTF-8
En-tête de réponse réel
Content-Type: text/html
Vous pouvez spécifier le codage des fichiers avec des extensions spécifiques en implémentant WebServerFactoryCustomizer pour personnaliser le comportement du conteneur Tomcat intégré. Cependant, uniquement si le jeu de caractères est uniquement déterminé pour l'extension.
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);
}
}
Je vais laisser quelques idées que j'ai essayées avant d'arriver ici.
En ajustant le paramètre d'application.properties, le comportement de CharacterEncodingFilter peut être modifié. Vous pouvez le modifier et forcer la sortie du jeu de caractères.
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
Cela fonctionne comme prévu pour les fichiers HTML, mais comme son nom l'indique, il est ajouté de force aux fichiers image, etc., ce qui est dommage.
Content-Type: image/jpeg;charset=UTF-8
CharacterEncodingFilter génère une sortie uniforme, il semble donc bon de dériver cette classe et d'implémenter votre propre filtre.
À première vue, cela semble fonctionner, mais cette méthode n'est possible que si elle peut être déterminée de manière unique à partir de l'URL de la requête.
Si vous faites quelque chose comme renvoyer index.html comme page de secours si le chemin ne peut pas être résolu (comme je l'ai fait dans mon cas), l'URL de la requête n'inclura pas nécessairement l'extension. Ce n'est pas toujours le cas, donc les informations requises pour le jugement sont insuffisantes.
@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