2016-07-18 274 views
18

Ho un file in bundle javascript che è abbastanza grande, ~ 1 MB. Sto cercando di attivare la compressione di risposta con le seguenti proprietà di applicazione nel mio file yml:La compressione della risposta di avvio di primavera non funziona

server.compression.enabled: true 
server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css 

Ma non funziona. Non sta avvenendo alcuna compressione

intestazioni di richiesta:

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 

intestazioni di risposta

Cache-Control:no-cache, no-store, max-age=0, must-revalidate 
Connection:keep-alive 
Content-Length:842821 
Content-Type:application/javascript;charset=UTF-8 

Non c'è nessuna intestazione codifica del contenuto nella risposta.

sto usando la primavera di avvio versione 1.3.5.RELEASE

Che cosa mi manca?

=== MODIFICA 4 === Avevo intenzione di creare un'app stand alone per indagare ulteriormente perché le proprietà di compressione del contenuto non funzionavano. Ma all'improvviso tutto ha iniziato a funzionare e non ho cambiato nulla per quanto riguarda la configurazione, non il cambio di file POM, non il cambio di file application.yml. Quindi non so che cosa è cambiato che ha reso lavorare ...

=== === EDIT 3 suggerimenti Segui @ di chimmi ulteriormente. Ho inserito punti di interruzione nei luoghi suggeriti. Sembra che le richieste di risorse statiche (file js) non siano mai state interrotte in quei punti di interruzione. Fanno solo le richieste API di riposo. E per quelle richieste, la lunghezza del contenuto era zero per qualche motivo che causa la compressione del contenuto da saltare.

enter image description here

=== === EDIT 2 ho messo un punto di interruzione alla linea 180 di osbawServerProperties grazie a @ di chimmi suggerimento e si vede che tutte le proprietà sono impostate ma in qualche modo la Server non rispetta l'impostazione ... :(

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

=== === EDIT 1

non è sicuro se è importante, ma sto incollando la mia applicazione codice principale e la configurazione qui:

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

Configurazione:

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

config server Resource:

@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 
    } 
} 
+0

Sono state prese questo SO -http: //stackoverflow.com/questions/21410317/using-gzip -compression-with-spring-boot-mvc-javaconfig-with-restful – aksappy

+0

@aksappy sì, l'ho fatto. Ho basato la mia soluzione sulla risposta n. 2 da quel collegamento. –

+0

Le intestazioni delle richieste hanno 'keep-alive', che indicano HTTP 1.0, ma la soluzione di riferimento usa' AbstractHttp11Protocol'. Forse hai bisogno di inviare richieste HTTP 1.1? – heenenee

risposta

2

Se si utilizza Tomcat non incorporato si dovrei aggiungere questo al tuo server.xml:

compression="on" 
compressionMinSize="2048" 
compressableMimeType="text/html,text/xml,application/javascript" 

More tomcat 8 config variables

+0

Immagino che non abbia un server.xml dal momento che usa spring boot –

+0

@ benjamin.d correct. Non ho server.xml. –

+0

Sto riscontrando lo stesso problema ... Distribuisco la mia applicazione REST di Spring Boot su AWS Elastic Beanstalk (istanza Tomcat), quindi non esiste server.xml. Sebbene io specifichi 'Accept-Encoding: gzip, deflate', nella risposta non vedo una' Content-Encoding'. Come posso aggirare questo? –

2

Forse il problema è con la configurazione YAML. Se si utilizza "Starters", SnakeYAML verrà fornito automaticamente tramite spring-boot-starter. In caso contrario, è necessario utilizzare la convenzione delle proprietà in application.properties. Using YAML instead of Properties

EDIT: prova con questo nel file yml:

server: 
     compression: 
     enabled: true 
     mime-types: text/html,text/xml,text/plain,text/css,application/javascript,application/json 
     min-response-size: 1024 
+0

Ho provato l'approccio break point suggerito da @chimmi e mostra che tutte le proprietà vengono lette dal contenitore di avvio di primavera (ho aggiornato il mio post originale con lo screenshot) ma vengono ignorate in qualche modo ... –

1

Non ho mai avuto molta fortuna con la compressione Spring Boot. Una soluzione semplice potrebbe essere quella di utilizzare una libreria di terze parti come ziplet.

Aggiungi 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> 

Aggiungi alla tua classe @Config:

@Bean 
public Filter compressingFilter() { 
    return new CompressingFilter(); 
}