gpt4 book ai didi

javascript - iOS 6 上的 Safari 是否缓存 $.ajax 结果?

转载 作者:行者123 更新时间:2023-12-03 20:21:29 25 4
gpt4 key购买 nike

自升级到 iOS 6 后,我们看到 Safari 的 WebView 冒昧地缓存 $.ajax 调用。这是在 PhoneGap 应用程序的上下文中,因此它使用 Safari WebView。我们的 $.ajax 调用是 POST 方法,我们将缓存设置为 false {cache:false},但这种情况仍在发生。我们尝试手动将 TimeStamp 添加到 header ,但没有帮助。

我们进行了更多研究,发现 Safari 仅返回具有静态函数签名且不会随调用而改变的 Web 服务的缓存结果。例如,假设一个函数调用如下:

getNewRecordID(intRecordType)

这个函数一遍又一遍地接收相同的输入参数,但它每次返回的数据应该是不同的。

一定是因为 Apple 急于让 iOS 6 快速运行,令人印象深刻的是他们对缓存设置太满意了。还有其他人在 iOS 6 上看到过这种行为吗?如果是这样,究竟是什么原因造成的?


我们找到的解决方法是将函数签名修改为如下所示:

getNewRecordID(intRecordType, strTimestamp)

然后总是传入一个 TimeStamp 参数,并在服务器端丢弃该值。这解决了这个问题。

最佳答案

经过一些调查,iOS6 上的 Safari 会缓存没有 Cache-Control header 甚至“Cache-Control: max-age=0”的 POST。

我发现防止这种缓存在全局级别发生而不是必须将随机查询字符串破解到服务调用结束的唯一方法是设置“Cache-Control:no-cache”。

所以:

  • 没有 Cache-Control 或 Expires header = iOS6 Safari 将缓存
  • Cache-Control max-age=0 和立即 Expires = iOS6 Safari 将缓存
  • Cache-Control: no-cache = iOS6 Safari 不会缓存

我怀疑 Apple 在第 9.5 节关于 POST 的 HTTP 规范中利用了这一点:

Responses to this method are not cacheable, unless the response includes appropriate Cache-Control or Expires header fields. However, the 303 (See Other) response can be used to direct the user agent to retrieve a cacheable resource.

所以理论上您可以缓存 POST 响应...谁知道呢。但直到现在,还没有其他浏览器制造商认为这是个好主意。但是,当没有设置 Cache-Control 或 Expires header 时,这不考虑缓存,只有当有一些设置时。所以这一定是一个错误。

下面是我在我的 Apache 配置的正确位中使用的内容来定位我的整个 API,因为碰巧我实际上不想缓存任何东西,甚至不想缓存任何东西。我不知道如何仅针对 POST 进行设置。

Header set Cache-Control "no-cache"

更新:刚刚注意到我没有指出只有当 POST 相同时,所以更改任何 POST 数据或 URL 就可以了。因此,您可以像其他地方提到的那样,将一些随机数据添加到 URL 或一些 POST 数据。

更新:如果您希望在 Apache 中这样,您可以将“无缓存”限制为 POST:

SetEnvIf Request_Method "POST" IS_POST
Header set Cache-Control "no-cache" env=IS_POST

关于javascript - iOS 6 上的 Safari 是否缓存 $.ajax 结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12512168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com