[JAVA] Spécifiez le codage des ressources statiques dans Spring Boot

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

Environnement de confirmation

Conclusion

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);
    }
}

Plan de bot

Je vais laisser quelques idées que j'ai essayées avant d'arriver ici.

1. Personnalisez CharacterEncodingFilter

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

2. Extension de CharacterEncodingFilter

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");
                }
            });
    }
}

Informations de référence

Recommended Posts

Spécifiez le codage des ressources statiques dans Spring Boot
Spécifiez spring.profiles.active via context-param dans web.xml dans Spring Boot
Obtenez une instance proxy du composant lui-même dans Spring Boot
Priorité d'accès aux fichiers statiques dans Spring Boot
Étapes pour rendre Spring Boot capable de faire référence à la valeur dans le fichier de propriétés
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Vérifions la sensation de Spring Boot + Swagger 2.0
Afficher la tâche Gradle dans le projet Spring Boot
Organisez les différences de comportement de @NotBlank, @NotEmpty et @NotNull avec Spring Boot + Thymeleaf
Obtenez le chemin défini dans la classe Controller de Spring Boot sous forme de liste
Paramètres du gestionnaire de ressources lors de la livraison du SPA avec la fonction de ressource statique de Spring Boot
Comment définir des variables d'environnement dans le fichier de propriétés de l'application Spring Boot
Obtenez plusieurs ressources qui correspondent au modèle au printemps
Exécution asynchrone des requêtes examinée dans Spring Boot 1.5.9
[Pour les débutants] DI ~ Les bases de DI et DI au printemps ~
Accédez au h2db intégré de Spring Boot avec jdbcTemplate
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
Comment utiliser CommandLineRunner dans Spring Batch of Spring Boot
Vérifiez le comportement de getOne, findById et des méthodes de requête avec Spring Boot + Spring Data JPA
Définir le paramètre contextuel dans Spring Boot
Multi-projets Spring Boot 2 avec Gradle
Changements majeurs dans Spring Boot 1.5
NoHttpResponseException dans Spring Boot + WireMock
Spring Boot 1.x atteindra EOL l'année prochaine.
L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2
À propos de la fonction de Spring Boot en raison de différentes versions
Une explication rapide des cinq types de statique Java
Mettez le fichier dans les propriétés de string avec la configuration spring xml
Accélérez les tests des validateurs qui nécessitent DI dans Spring Boot
Une histoire remplie des bases de Spring Boot (résolu)
Les ressources statiques ne pouvaient pas être distribuées à partir de WebFlux lorsque @EnableWebFlux était accordé dans Spring Boot
Traitement de branche avec la valeur de retour de RestTemplate et le code d'état de ResponseEntity dans Spring Boot
Spring Boot Hello World dans Eclipse
Développement d'applications Spring Boot dans Eclipse
Mémorandum lorsque Spring Boot 1.5.10 → Spring Boot 2.0.0
Spring Boot pour la première fois
Exemple de code qui utilise le moteur de modèle Moustache avec Spring Boot
Écrire du code de test avec Spring Boot
Spécifiez l'emplacement Java dans eclipse.ini
Voir le comportement de redirection relative avec le paramètre server.tomcat.use-relative-redirects dans Spring Boot
Sortie de message (Spring boot)
Ce que j'ai fait lors de la migration de la série Spring Boot 1.4 vers la série 2.0
Implémenter l'API REST avec Spring Boot
Qu'est-ce que @Autowired dans Spring Boot?
La validation de printemps était importante dans l'ordre de Form et BindingResult
Implémenter l'application Spring Boot dans Gradle
Ce que j'ai fait lors de la migration de la série Spring Boot 1.5 vers la série 2.0
Voir le comportement des mises à jour d'entités avec Spring Boot + Spring Data JPA
Je veux contrôler le message d'erreur par défaut de Spring Boot
[Spring Boot] Jusqu'à ce que @Autowired soit exécuté dans la classe de test [JUnit5]
Formulaire qui reçoit la valeur de l'élément répétitif dans Spring MVC
Ordre de traitement dans le programme
Je veux connaître la méthode du contrôleur où l'exception a été levée dans le ExceptionHandler de Spring Boot
Comment utiliser Thymeleaf avec Spring Boot
Filtrer le résultat de BindingResult [Spring]
Erreur inconnue dans la ligne 1 de pom.xml lors de l'utilisation de Spring Boot dans Eclipse
Coexistence de Flyway dans la base de données embarquée (h2) de l'environnement de développement et la base de données des versions (SQL Server) avec Spring Boot
[Spring Boot] Liste des règles de validation qui peuvent être utilisées dans le fichier de propriétés pour les messages d'erreur
[Spring Boot] J'ai étudié comment implémenter le post-traitement de la demande reçue.