我的问题非常简单。虽然在搜索时,我还没有找到一个简单令人满意的答案。
我正在使用Jquery ajax请求从服务器获取数据。服务器托管一个rest api,它将Etag和Cach控制头设置为
GET requests
。服务器还设置CORS标头以允许Etag
。 Api的客户端是一个浏览器Web应用程序。我正在使用Ajax请求来调用Api。以下是一个简单的GET请求后服务器的响应头:
Status Code: 200 OK
Access-Control-Allow-Origin: *
Cache-Control: no-transform, max-age=86400
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: application/json
Date: Sun, 30 Aug 2015 13:23:41 GMT
Etag: "-783704964"
Keep-Alive: timeout=15, max=99
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
Vary: Accept-Encoding
access-control-allow-headers: X-Requested-With, Content-Type, Etag,Authorization
access-control-allow-methods: GET, POST, DELETE, PUT
我想知道的是:
我是否需要从服务器发送的响应标头中手动收集Etag
并将if-no-match
标头附加到ajax请求。当浏览器具有'Etag'时,浏览器默认在conditional get
请求中发送它
conditional GET
并设置if-no-match
标头。Etag
,为什么浏览器不会从服务器获取更新的数据集,除非我必须重新加载/users?next=0
。 next is a query param
,其中next
的值因每个新请求而变化。由于每个响应都会得到自己的'Etag'。浏览器是否会根据请求存储“Etag”,或者它只存储先前获取请求的最新Etag
,而不管URL。请提供答案。我真的很困惑。
谢谢
好吧,我已经以某种方式弄清楚了解决方案:
当浏览器看到url在之前的if-no-match
上有e-tag
标头时,浏览器会发送request
标头。浏览器会根据该URL保存e-tag
,因此发生不同URL的请求数无关紧要。
另外,一个强制浏览器获取conditional-get
来检查e-tag
的技巧:
Set the max-age header to the lowest
(对我来说60s很棒)cache
到期,浏览器将发送conditional-get
来检查expired cached resource
是否有效。如果if-no-match
标题与e-tag
匹配。服务器使用304: Not-Modified
标头发回响应。这意味着过期的缓存资源有效且可以使用。