显式禁用REST服务的缓存

时间:2016-08-24 17:49:39

标签: rest http-caching

我将Cache-Control: must-revalidate,no-cache,no-store应用于来自后端REST服务的所有响应。我有两个问题:

  • 通常这样做吗?出于某种原因,我的印象是没有必要,但我没有任何消息来支持这个说法(<)。
  • 我上面提到的值是否足够,或者我应该设置更多?

编辑:发现:https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers#cache-prevention。是说浏览器可以选择在没有显式配置时缓存,所以它意味着是,如果我想确保缓存被禁用,则应该配置它。

2 个答案:

答案 0 :(得分:3)

简短:是的,即使没有明确的控件,缓存也可以缓存响应,您需要明确禁止它。

HTTP caching specification Section 3列出禁止缓存响应的时间。它建议只要响应代码可缓存,就可以缓存响应 。可缓存的响应代码列表位于HTTP specification section 6.1

  

响应默认情况下定义为可缓存的状态代码      (例如,200,203,204,206,300,301,404,405,410,414和501 in      具有启发式的缓存可以重用此规范)      到期,除非方法定义另有说明或      显式缓存控件......

&#34;启发式到期&#34;定义为没有显式控件时分配的到期时间。 (HTTP caching specification section 4.2.

答案 1 :(得分:2)

我认为它默认是禁用的。虽然有一些机制可以启用缓存以提高性能:

以下是一个很好的解释,其中包含如何启用缓存的示例:

[来源:Heroku Dev Center]

  

基于时间的缓存标头

     

在HTTP 1.1中,Cache-Control标头指定资源缓存行为以及可以缓存资源的最大年龄。例如,此响应将缓存一天:

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: private, max-age=86400
Last-Modified: Thu, 07 Feb 2013 11:56 EST
     

以下是所有可用Cache-Control令牌及其列表的列表   意思是:

     
      
  • private只有客户(主要是浏览器)而没有其他人   链(如代理)应该缓存此
  •   
  • public链中的任何实体都可以缓存此
  •   
  • no-cache无论如何都不应该被缓存
  •   
  • no-store可以缓存,但不应存储在磁盘上(大多数浏览器会将资源保留在内存中,直到它们退出为止)
  •   
  • no-transform不应修改资源(例如代理缩小图片)
  •   
  • max-age资源有效期多长(以秒为单位)
  •   
  • s-maxage与max-age相同,但此值仅适用于非客户
  •   

这里有一个CDI Cache Control注释的例子:

[来源:abhirockzz.wordpress.com]

@Path("/testcache")
public class RESTfulResource {
    @Inject
    @CachControlConfig(maxAge = 20)
    CacheControl cc;

    @GET
    @Produces("text/plain")
    public Response find() {
        return Response.ok(UUID.randomUUID().toString()).cacheControl(cc).build();
    }
}