web-dev-qa-db-ja.com

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に2行のコードを追加しましたが、応答に2つの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

私は何を間違えましたか?誰かが私に助けをくれませんか。

9
user3742622

TL; DR


application.propertiesに以下を追加するだけです。

security.headers.cache=false

詳細


として 春のセキュリティドキュメント 状態:

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ヘッダーを取得します

それらの1つは、SpringSecurityによって提供されます。それらが気に入らない場合は、WebSecurityConfigurerAdapterのデフォルトのCache-Controlヘッダーを無効にすることができます。

@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);
16
Ali Dehghani