2016-06-30 2 views
6

Я не очень хорош в Java + Spring, но я бы хотел добавить заголовок Cache-Control в мой ResponseEntity.Java + Spring Boot: я пытаюсь добавить заголовок CacheControl в 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 

Что я сделал не так? Может ли кто-нибудь дать мне руку помощи.

+0

Вы используете Весенняя безопасность? –

+0

Да, мое приложение имеет базовую аутентификацию для достижения REST API. – user3742622

ответ

14

TL; DR

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

security.headers.cache=false 

Подробнее Подробнее

Как Spring Security documentation состояний:

Spring Security позволяет пользователям легко введите значение по умолчанию sec заголовок , чтобы помочь в защите их применения. По умолчанию для 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 заголовки в моем ответе

Один из них обеспечивается Spring Security. Если вы не любите их, вы можете отключить параметр по умолчанию 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 загрузку, вы можете достичь того же, используя security.headers.* свойства. Для того, чтобы отключить этот заголовок по умолчанию Cache-Control, просто добавьте следующую строку в ваш application.properties:

security.headers.cache=false 

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

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

Спасибо большое! – user3742622

+0

отлично, это сработало и для меня. По какой-то причине вещь 'security.headers.cache = false' не повлияла на результаты, однако явное расширение« WebSecurityConfigurerAdapter »сделало трюк. Теперь у меня есть мои контроллеры, явно объявляющие свою политику кэширования. Отличный намек. – Antonio

Смежные вопросы