Chrome正在缓存HTTP PUT请求
我对Chrome有这个奇怪的问题。 它经常出现缓存PUT请求。
详细信息:我有一个使用backbone.js的应用程序,当尝试将某些更改保留到模型时(主干自动生成PUT请求),Chrome只是不会将该请求发送到服务器。 它在Firefox和IE中运行得非常好(到目前为止还没有在Safari中看到过这个问题)。
以下是Chrome开发者工具“网络”标签的屏幕截图。 如您所见,PUT请求的响应是从缓存返回的(请求没有到达服务器!!)
这是同一请求的标题详细信息的屏幕截图。 再一次,很明显Chrome并不打算将PUT请求发送到服务器。
请求的有效负载是JSON数据。 有关为什么会发生这种情况的想法/我做错了什么?
更新: Chromium已经确认这确实是一个错误 (感谢JanHančič)。
临时解决方案我最终覆盖了Backbone.sync
方法,并将时间戳附加到PUT,POST和DELETE请求的查询字符串,以便它们始终是唯一的:
if(!options.data && model && (method == 'create' || method == 'update' || method == 'delete')) { params.url += (params.url.indexOf('?') == -1 ? '?' : '&') + '_=' + new Date().getTime(); }
我使用额外的参数来避免缓存:
url += '?_dc=' + Math.random().toFixed(20).replace('.', '');
我不解释服务器端的这个参数。
编辑:除了chrome之外,还有很多东西可以缓存请求 – 例如用户的代理服务器。 我认为额外的查询参数是一个很好的解决方案,以防止缓存。
Backbone使用jQuery或Zepto来发出AJAX请求。 假设您正在使用jQuery,请关闭缓存。
运行此命令可在整个应用程序中关闭缓存,因此您无需担心缓存:
$.ajaxSetup({ cache : false });
如果保持缓存对您的业务很重要,我认为您可以针对特定的无缓存调用执行类似的操作:
model.save({}, {cache:false});