Chrome正在缓存HTTP PUT请求

时间:2012-08-01 06:33:02

标签: javascript google-chrome jquery backbone.js

我对Chrome有这个奇怪的问题。它经常出现缓存PUT请求。

详细信息:我有一个使用backbone.js的应用程序,当尝试将某些更改保留到模型时(主干自动生成PUT请求),Chrome就不会将该请求发送到服务器。它在Firefox和IE中运行得非常好(到目前为止还没有在Safari中看到过这个问题)。

以下是Chrome开发者工具“网络”标签的屏幕截图。如您所见,PUT请求的响应是从缓存返回的(请求没有到达服务器!!) Chrome caches PUT request

以下是同一请求的标题详细信息的屏幕截图。再一次,很明显Chrome并不打算将PUT请求发送到服务器。 Chrome cached PUT request header

请求的有效负载是JSON数据。关于为什么会这样做/我做错了什么的想法?

更新:Chromium确认这确实是bug on it's end(感谢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();
}

2 个答案:

答案 0 :(得分:4)

我使用额外的参数来避免缓存:

url += '?_dc=' + Math.random().toFixed(20).replace('.', '');

我不在服务器端解释此参数。

编辑:除了Chrome之外,还有很多东西可以缓存请求 - 例如用户的代理服务器。我认为额外的查询参数是避免缓存的好方法。

答案 1 :(得分:0)

Backbone使用jQuery或Zepto来发出AJAX请求。假设您正在使用jQuery,请关闭缓存。

运行此命令以在整个应用程序中关闭缓存,这样您就不必担心缓存:

$.ajaxSetup({
      cache : false
});

如果保持缓存对您的业务很重要,我认为您可以针对特定的无缓存调用执行此类操作:

model.save({}, {cache:false});