我们的调查向我们表明,并非所有浏览器都以统一的方式尊重http缓存指令.
出于安全原因,我们不希望在我们的应用程序某些网页缓存,有史以来,通过Web浏览器.这必须至少适用于以下浏览器:
我们的要求来自安全测试.从我们的网站注销后,您可以按后退按钮查看缓存页面.
自升级到iOS 6以来,我们看到Safari的Web视图可以自由地缓存$.ajax
调用.这是在PhoneGap应用程序的上下文中,因此它使用Safari WebView.我们的$.ajax
调用是POST
方法,我们将缓存设置为false {cache:false}
,但仍然会发生这种情况.我们尝试手动添加TimeStamp
标题,但它没有帮助.
我们做了更多研究,发现Safari只返回具有静态功能签名并且不会因呼叫而改变的Web服务的缓存结果.例如,想象一个名为:
getNewRecordID(intRecordType)
Run Code Online (Sandbox Code Playgroud)
该函数反复接收相同的输入参数,但每次返回的数据应该不同.
一定是苹果急于让iOS 6拉链令人印象深刻,他们对缓存设置感到满意.还有其他人在iOS 6上看到过这种行为吗?如果是这样,究竟是什么导致了它?
我们发现的解决方法是将函数签名修改为如下所示:
getNewRecordID(intRecordType, strTimestamp)
Run Code Online (Sandbox Code Playgroud)
然后总是传入一个TimeStamp
参数,并在服务器端丢弃该值.这解决了这个问题.我希望这能帮助其他一些在这个问题上花费15个小时的穷人,就像我一样!
我遇到了ajax缓存的问题,这也是IE浏览器中的问题,但我通过编写以下代码修复了它.
response.setHeader("Cache-Control", "no-cache");
response.setHeader("expires","-1");
response.setHeader("pragma","no-cache");
Run Code Online (Sandbox Code Playgroud)
但我看到MAC上的Safari4.0正在缓存Ajax请求(我们有一个要求支持这一点).火狐永远不会有问题.关于这个"Expire"我将它设置为-1,我看到很多地方设置0或者过去的旧日期.它会有所作为吗?
最近,Safari 11在Mac OSX上发布.此更新导致我们的Web应用程序与我们的reuest标头上的XSRF结合使用时出现问题.我将尝试以逻辑方式描述问题.这就是好情况的样子:
当用户想要登录时,他从服务器接收带有Set-Cookie的响应,该Set-Cookie包含XSRF令牌的值. Eg: Set-Cookie: XSRF-TOKEN=LKNBX4DZhL708KjXNkgXnlxTDCNuhsZG1kTc2SFy498; Path=/; Secure
页面刷新将执行的下一个调用包含标头中的正确XSRF值.在服务器端,检查值等.来自前端的每个调用都将包含该XSRF令牌.
如果用户注销并想再次登录,则他的XSRF cookie将被新值覆盖,并且能够使用该令牌登录.
我们的问题情况(在Mac OSX上使用Safari 11,其他浏览器不显示此行为):
如果没有cookie存在,用户可以正常登录
但是,如果他想重新登录(在上一个会话之后),则会进行刷新.在第一次调用时,刷新其调用的XSRF令牌不会被新值替换,它们仍然包含来自前一会话的旧XSRF令牌.当我们检查此请求时,我们看到此请求中的cookie包含正确的值,但标头反映了旧令牌.
使用错误标题的此调用会导致会话在后端关闭,因此用户将被踢出会话.TLDR; 在Safari 11中,标题XSRF-TOKEN在刷新后不会相应地更新cookie值.我们在旧版本和其他浏览器上工作,我们认为这是一个Safar 11错误.
还有其他人遇到过类似的问题吗?在Safari 11中刷新页面后,请求的标头值是否未更新?
编辑:经过测试,我们发现在URL中放置时间戳作为查询参数会强制Safari 11发送正确的请求.似乎缓存了一些请求并忽略了更新的标头.
非常感谢!
caching ×3
ajax ×2
http-headers ×2
javascript ×2
safari ×2
header ×1
http ×1
https ×1
java ×1
jquery ×1
setcookie ×1
x-xsrf-token ×1