2016-06-30 8 views
6

hinzuzufügen Ich bin nicht so gut in Java + Spring, aber ich möchte Cache-Control Header zu meinem ResponseEntity hinzufügen.Java + Spring Boot: Ich versuche CacheControl-Header zu 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); 
     } 
} 

habe ich zwei Zeilen Code für HttpHeaders und ich jetzt zwei Cache-Control Header in meiner Antwort:

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 

Was habe ich falsch gemacht? Könnte mir jemand helfen?

+0

Stehen Sie mit Frühlingssicherheit? –

+0

Ja, meine App verfügt über eine Standardauthentifizierung für das Erreichen der REST-API. – user3742622

Antwort

14

TL; DR

Fügen Sie einfach das folgende in der application.properties:

security.headers.cache=false 

Details

Wie Spring Security documentation heißt es:

Spring Security ermöglicht es Benutzern, auf einfache Weise injiziere die Standard sek urity Header zum Schutz ihrer Anwendung zu unterstützen. Der Standardwert für Spring Security ist die folgenden Header enthalten:

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 

jetzt bekomme ich 2 Cachecontrol-Header in meiner Antwort

Einer von ihnen von Spring Security zur Verfügung gestellt. Wenn Sie sie nicht mögen, können Sie den Standard Cache-Control Header in Ihrem WebSecurityConfigurerAdapter deaktivieren:

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

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

Da Sie Frühlings-Boot verwenden, können Sie das gleiche mit den security.headers.* Eigenschaften erzielen. Um diesen Standard Cache-Control Header zu deaktivieren, fügen Sie einfach den folgenden Code zu Ihrem application.properties:

security.headers.cache=false 

Auch mehr idiomatische Weise Cache-Control Header hinzuzufügen, ist die neue cacheControl Builder zu verwenden:

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

Vielen Dank Mann! – user3742622

+0

Toll, das hat auch für mich funktioniert. Aus irgendeinem Grund hat die 'security.headers.cache = false' Sache die Ergebnisse nicht beeinflusst, jedoch hat die explizite Erweiterung des 'WebSecurityConfigurerAdapter' den Zweck erfüllt. Jetzt haben meine Controller explizit ihre Caching-Policy deklariert. Toller Hinweis. – Antonio