web-dev-qa-db-fra.com

La compression de la réponse au démarrage du printemps ne fonctionne pas

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.

 enter image description here

=== 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... :(

 Printing the Compression object at o.s.b.a.w.ServerProperties line 180

=== 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
    }
}
21
Quan Ding

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
2
Patryk Dobrzyński

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"

Plus de variables de configuration Tomcat 8

2
Patryk Dobrzyński

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

1
abaghel

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();
}
1
Gandalf

vous devez activer ssl comme le mode http2, la compression de la réponse (Content-Encoding) peut fonctionner, lorsque le mode ssl est configuré .  Content-Encoding:gzip

compression de la réponse

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
0
s.a.hosseini