如果服务器发送Etag,是否需要在ajax请求中以编程方式设置if-no-match

问题描述 投票:3回答:1

我的问题非常简单。虽然在搜索时,我还没有找到一个简单令人满意的答案。

我正在使用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标头。
  • 如果它是正确的,假设,我创建了一个新资源,然后我调用了get请求。它首次为我提供了过去的缓存数据。但是当我重新加载页面时,它会提供更新的页面。所以我很困惑,如果服务器端的数据集发生了变化并发送了不同的Etag,为什么浏览器不会从服务器获取更新的数据集,除非我必须重新加载

  • 也是在分页的情况下。假设我有一个网址/users?next=0next is a query param,其中next的值因每个新请求而变化。由于每个响应都会得到自己的'Etag'。浏览器是否会根据请求存储“Etag”,或者它只存储先前获取请求的最新Etag,而不管URL。

请提供答案。我真的很困惑。

谢谢

ajax cors jax-rs etag if-none-match
1个回答
0
投票

好吧,我已经以某种方式弄清楚了解决方案:

当浏览器看到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标头发回响应。这意味着过期的缓存资源有效且可以使用。
© www.soinside.com 2019 - 2024. All rights reserved.