Java + Spring Boot: я пытаюсь добавить заголовок cachecontrol в ResponseEntity

Я не так хорош в Java + Spring, но я хотел бы добавить Cache-Control мой заголовок 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);
        }
}

я добавил две строки кода HttpHeaders и теперь я получаю два Cache-Control заголовки в моем ответе:

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

что я сделал не так? Кто-нибудь может мне помочь?

1 ответов


TL; DR

просто добавьте следующее к вашему application.properties:

security.headers.cache=false

Более Подробная Информация

As Весенняя документация по безопасности гласит:

Spring Security позволяет пользователям легко вводить безопасность по умолчанию заголовки, чтобы помочь в защите их приложения. По умолчанию Spring Security должен включать следующие заголовки:

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

теперь я получите 2 заголовка CacheControl в моем ответе

один из них обеспечен безопасностью весны. Если они вам не нравятся, вы можете отключить значение по умолчанию Cache-Control заголовки WebSecurityConfigurerAdapter:

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

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

поскольку вы используете Spring Boot, вы можете добиться того же, используя security.headers.* свойства. Чтобы отключить это значение по умолчанию Cache-Control заголовок, просто добавьте следующее в свой application.properties:

security.headers.cache=false

кроме того, более идиоматические способ добавления Cache-Control заголовки-это используйте новый cacheControl строитель:

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