4

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

我正在使用 Jquery ajax 请求从服务器获取数据。服务器托管一个将 Etag 和 Cach-control 标头设置为GET requests. 服务器还设置 CORS 标头以允许Etag. Api 的客户端是一个浏览器网络应用程序。我正在使用 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从服务器发送的响应标头并将标头附加到 ajax 请求?或者浏览器在具有“Etag”if-no-match的请求中默认发送它conditional get

  • 我已经在浏览器中通过网络控制台进行了调试,似乎浏览器正在conditional GET自动执行并设置if-no-match标题。

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

  • 在分页的情况下也是如此。假设我有一个 URL /users?next=0。每个新请求next is a query param的更改值。next因为每个响应都会得到自己的“Etag”。浏览器会根据请求存储“Etag”还是只存储Etag上一个获取请求的最新请求,而与 URL 无关。
4

1 回答 1

0

好吧,我自己想出了解决方案:

当浏览器if-no-match看到 url 在e-tagprevious 上有标头时,它会自行发送标头request。浏览器会保存e-tag与该 URL 相关的信息,因此发生多少具有不同 URL 的请求并不重要。

此外,强制浏览器获取 aconditional-get以检查的技巧e-tag

  • Set the max-age header to the lowest(对我来说 60 年代的作品很棒)
  • 一旦cache过期,浏览器将发送一个conditional-get检查是否expired cached resource有效。如果if-no-match标头与e-tag. 服务器将带有304: Not-Modified标头的响应发送回。这意味着过期的缓存资源是有效的,可以使用。
于 2015-09-14T10:45:04.490 回答