Servlet响应ETag Cache

时间:2013-12-07 16:20:40

标签: http caching servlets smartgwt etag

我想使用ETag来缓存请求的版本并返回304而不是修改后的响应给客户端,以便客户端可以使用最后一个缓存页面。

所以我的网址就像这样返回一个json响应

"http://server/WEB_GWT/prmCall?prmName=PRM_SIS_PROG_REG_STATUS"

在处理此请求的servlet中,我总是将ETag信息存储为url param PRM_SIS_PROG_REG_STATUS 的版本。 因此返回客户端的响应头是

HTTP/1.1 200 OK
Date: Sat, 07 Dec 2013 16:07:49 GMT
Server: IBM_HTTP_Server
ETag: "5"
Last-Modified: Sat, 07 Dec 2013 16:07:49 GMT
Content-Length: 356
Keep-Alive: timeout=10, max=99
Connection: Keep-Alive
Content-Type: application/json
Content-Language: tr-TR

在我的下一个请求中,我希望此请求标头包含“If-None-Match”标头以返回请求的版本,但我无法获得此标头参数。知道为什么我不能让我的ETag回来。

我的下一个请求标题是

 GET /OZU_GWT/prmCall?prmName=PRM_SIS_PROG_REG_STATUS HTTP/1.1
Host: 10.100.199.103
Connection: keep-alive
Cache-Control: max-age=0
If-Modified-Since: Thu, 01 Jan 1970 00:00:00 GMT
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
Accept: */*
Referer: http://10.100.199.103/OZU_GWT/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: JSESSIONID=0000kvocMBmjoWPbpKt_VAsDUMv:-1

2 个答案:

答案 0 :(得分:1)

Inoder缓存您的请求,您需要包含“Cache-Control”指令,并指定缓存响应的方式以及在什么时间段内。

  

HTTP / 1.1 200 OK
  日期:2013年12月7日星期六16:07:49 GMT
  服务器:IBM_HTTP_Server
  ETag:“5”
  缓存控制:public,max-age = 86400
  内容长度:356
  保持活跃:超时= 10,最大= 99
  连接:保持活力
  内容类型:application / json
  内容 - 语言:tr-TR

此处,Cache-Control标头表示内容可以由“公共”缓存服务器存储,并且需要重新验证内容的持续时间为86400秒。因此,当您再次刷新页面时,“If-None-Match”和“If-Modified-Since”条件标头将启动并使用缓存数据。

答案 1 :(得分:1)

经过一番调查后,我发现SmartGWT框架请求被发送到带有bypassCache:true标志的服务器,该标志是在没有任何缓存头的情况下发送我的xhr请求。我设法通过覆盖DataSource类中的跟随方法来修复它。

@Override
protected Object transformRequest(DSRequest dsRequest) {
    dsRequest.setBypassCache(false);