J'ai un fichier javascript assez volumineux, environ 1 Mo . J'essaie d'activer la compression des réponses avec les propriétés d'application suivantes dans mon fichier yml:
server.compression.enabled: true
server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css
Mais ça ne marche pas. Aucune compression n'est en cours.
En-têtes de demande:
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Accept: */*
Accept-Encoding: gzip, deflate, sdch, br
En-têtes de réponse
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Connection:keep-alive
Content-Length:842821
Content-Type:application/javascript;charset=UTF-8
Il n'y a pas d'en-tête de codage de contenu dans la réponse.
J'utilise la version de démarrage de printemps 1.3.5.RELEASE
Qu'est-ce que je rate?
=== EDIT 4 === Je prévoyais de créer une application autonome pour mieux comprendre pourquoi les propriétés de compression du contenu ne fonctionnaient pas . Mais tout à coup, cela a commencé à fonctionner et je n'ai rien changé configuration, pas de changement de fichier POM, pas de changement de fichier application.yml. Donc, je ne sais pas ce qui a changé qui a fait que ça fonctionne ...
=== EDIT 3 === Suivez les suggestions de @ chimmi plus loin. J'ai mis des points d'arrêt dans les endroits suggérés. Il semble que les demandes de ressources statiques (fichiers js) ne se soient jamais arrêtées à ces points de rupture. Seules les demandes d'API restantes le font. Et pour ces requêtes, la longueur du contenu était égale à zéro pour une raison quelconque qui a pour effet d’éviter la compression du contenu.
=== EDIT 2 === J'ai mis un point d'arrêt à la ligne 180 de osbawServerProperties grâce à la suggestion de @ chimmi, qui indique que toutes les propriétés sont définies, mais que le serveur n'honore pas le réglage... :(
=== EDIT 1 ===
je ne sais pas si c'est important, mais je colle ici mon code principal et mon code de configuration:
Application.Java:
@SpringBootApplication
public class TuangouApplication extends SpringBootServletInitializer {
public static void main(String[] args) throws Exception {
SpringApplication.run(TuangouApplication.class, args);
}
// this is for WAR file deployment
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(TuangouApplication.class);
}
@Bean
public javax.validation.Validator localValidatorFactoryBean() {
return new LocalValidatorFactoryBean();
}
}
Configuration:
@Configuration
public class TuangouConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http.antMatcher("/**").authorizeRequests().antMatchers("/", "/login**").permitAll()
.and().antMatcher("/**").authorizeRequests().antMatchers("/api/**").permitAll()
.and().exceptionHandling().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/"))
.and().formLogin().loginPage("/login").failureUrl("/login?error").permitAll()
.and().logout().logoutSuccessUrl("/").permitAll()
.and().csrf().csrfTokenRepository(csrfTokenRepository())
.and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
.headers().defaultsDisabled().cacheControl();
// @formatter:on
}
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled=true)
protected static class AuthenticationSecurity extends GlobalAuthenticationConfigurerAdapter {
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService()).passwordEncoder(new BCryptPasswordEncoder());
}
@Bean
public UserDetailsService userDetailsService() {
return new DatabaseUserServiceDetails();
}
}
private Filter csrfHeaderFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
CsrfToken csrf = (CsrfToken) request
.getAttribute(CsrfToken.class.getName());
if (csrf != null) {
Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
String token = csrf.getToken();
if (cookie == null
|| token != null && !token.equals(cookie.getValue())) {
cookie = new Cookie("XSRF-TOKEN", token);
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
};
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
}
Configuration du serveur de ressources:
@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter{
@Autowired
private TokenStore tokenStore;
@Override
public void configure(ResourceServerSecurityConfigurer resources)
throws Exception {
resources.tokenStore(tokenStore);
}
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http.antMatcher("/**").authorizeRequests().antMatchers("/api/**").permitAll();
// @formatter:on
}
}
Le problème vient peut-être de la configuration de YAML . Si vous utilisez ‘Starters’ SnakeYAML sera automatiquement fourni via spring-boot-starter
Si vous ne le faites pas, vous devez utiliser la convention de propriétés dans application.properties . Utiliser YAML au lieu de Propriétés
EDIT: Essayez avec ceci dans votre fichier yml:
server:
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,text/css,application/javascript,application/json
min-response-size: 1024
Si vous utilisez Tomcat non incorporé, vous devez ajouter ceci à votre fichier server.xml:
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,application/javascript"
Avez-vous essayé avec différents navigateurs? Cela pourrait être dû à un antivirus qui décompresse le fichier comme indiqué dans le SO post La compression de la réponse http au démarrage de printemps ne fonctionne pas pour certains agents utilisateurs
Jamais eu beaucoup de chance avec la compression Spring Boot. Une solution simple pourrait consister à utiliser une bibliothèque tierce telle que ziplet.
Ajouter à pom.xml
<dependency>
<groupId>com.github.ziplet</groupId>
<artifactId>ziplet</artifactId>
<version>2.0.0</version>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
</exclusions>
</dependency>
Ajoutez à votre classe @Config:
@Bean
public Filter compressingFilter() {
return new CompressingFilter();
}
vous devez activer ssl comme le mode http2, la compression de la réponse (Content-Encoding) peut fonctionner, lorsque le mode ssl est configuré .
application.yml
server:
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,text/css, application/javascript, application/json
min-response-size: 1024
ssl:
enabled: true
key-store: keystore.p12
key-store-password: pass
keyStoreType: PKCS12
keyAlias: name
spring:
resources:
chain:
gzipped: true