2016-06-30 16 views
6

Non sono così bravo in Java + Spring, ma mi piacerebbe aggiungere l'intestazione Cache-Control al mio ResponseEntity.Java + Spring Boot: Sto cercando di aggiungere l'intestazione di CacheControl a ResponseEntity

@RequestMapping(value = "/data/{id}", method = GET") 
public ResponseEntity<String> getData(@PathVariable("id") String id) { 
    try { 
      ... 
      HttpHeaders headers = new HttpHeaders(); 
      headers.setCacheControl("max-age=600"); 

      return new ResponseEntity<String>(body, headers, HttpStatus.OK); 
     } 
} 

ho aggiunto due righe di codice per HttpHeaders e ora ho due Cache-Control intestazioni nella mia risposta:

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
X-Content-Type-Options: nosniff 
X-XSS-Protection: 1; mode=block 
Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
Pragma: no-cache 
Expires: 0 
X-Frame-Options: DENY 
Strict-Transport-Security: max-age=31536000 ; includeSubDomains 
Cache-Control: max-age=600 
Content-Type: application/json;charset=UTF-8 
Content-Length: 18223 
Date: Wed, 29 Jun 2016 21:56:57 GMT 

Che cosa ho fatto di sbagliato? Qualcuno potrebbe darmi una mano.

+0

Si sta utilizzando Sicurezza di primavera? –

+0

Sì, la mia app ha l'autenticazione di base per raggiungere l'API REST. – user3742622

risposta

14

TL; DR

Basta aggiungere la seguente alle vostre application.properties:

security.headers.cache=false 

Maggiori dettagli

Come Spring Security documentation stati:

Primavera di sicurezza consente agli utenti di facilmente iniettare il sec predefinito urezza intestazioni per aiutare a proteggere la loro applicazione. L'impostazione predefinita per Primavera di sicurezza è quello di includere le seguenti intestazioni:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
Pragma: no-cache 
Expires: 0 
X-Content-Type-Options: nosniff 
Strict-Transport-Security: max-age=31536000 ; includeSubDomains 
X-Frame-Options: DENY 
X-XSS-Protection: 1; mode=block 

Ora ho 2 intestazioni CacheControl nella mia risposta

Uno di loro è fornito da Primavera di sicurezza. Se non ti piace di loro, è possibile disattivare il default Cache-Control intestazioni nella vostra WebSecurityConfigurerAdapter:

@Configuration 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 
    // Other configurations 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       // Other configurations 
       .headers() 
        .cacheControl().disable(); 
    } 
} 

Dal momento che si sta utilizzando Primavera di avvio, è possibile ottenere lo stesso utilizzando le security.headers.* proprietà. Per disabilitare l'intestazione di default Cache-Control, basta aggiungere il seguente al vostro application.properties:

security.headers.cache=false 

Inoltre, il modo più idiomatico di aggiungere Cache-Control intestazioni è quello di utilizzare la nuova cacheControl costruttore:

ResponseEntity.ok() 
       .cacheControl(CacheControl.maxAge(600, TimeUnit.SECONDS)) 
       .body(body); 
+1

Grazie mille amico! – user3742622

+0

ottimo, questo ha funzionato anche per me. Per qualche ragione la cosa 'security.headers.cache = false' non ha influenzato i risultati, tuttavia estendere esplicitamente' WebSecurityConfigurerAdapter' ha funzionato. Ora ho i miei controller che dichiarano esplicitamente la loro politica di caching. Ottimo suggerimento. – Antonio

Problemi correlati