禁用浏览器缓存

时间:2010-10-15 12:34:40

标签: javascript rest browser-cache

我实现了一个REST服务,我正在使用一个网页作为客户端。 我的页面有一些javascript函数,它们对REST服务器执行多次相同的http get请求并处理回复。

我的问题是浏览器缓存了第一个回复,而不是实际发送以下请求..

有没有办法强制浏览器在没有缓存的情况下执行所有请求? 我正在使用Internet Explorer 8.0

由于

3 个答案:

答案 0 :(得分:8)

不确定它是否可以帮助您,但有时候,我会在请求的网址中添加一个随机参数,以避免被缓存。

所以不要:

http://my-server:8080/myApp/foo?bar=baz

我会用:

http://my-server:8080/myApp/foo?bar=baz&random=123456789

当然,random的值对于每个请求都是不同的。您可以使用当前时间(以毫秒为单位)。

答案 1 :(得分:7)

不是真的。这是IE的一个已知问题,经典的解决方案是在每个请求的查询字符串末尾附加一个随机参数。如果你要求它们(例如jQuery的cache:false AJAX选项),大多数JS库本身就会这样做。

答案 2 :(得分:2)

嗯,当然你实际上并不想完全禁用浏览器缓存;正确的缓存是REST的一个关键部分,它可以(如果客户端和服务器都适当地遵循)允许高度缓存,同时也可以对缓存到期进行精确控制,重新验证是关键优势之一。 / p>

正如您所发现的那样,存在一个问题,即后续GET与同一文档中的相同URI(在DOM文档生命周期中,重新加载页面,您将再次获取该XMLHttpRequest请求)。 IE似乎很好地对待它,因为它会在网页中请求同一图像或其他相关资源的多个副本;即使实体不可缓存,它也会使用缓存版本。

Firefox存在相反的问题,即使缓存信息表明它不应该发送,也会发送后续请求!

我们可以在每个请求的查询字符串末尾添加一个随机或带时间戳的虚假参数。然而,这有点像尖叫“这是SPARTA!”并将我们来之不易的下载放入一个没有Health&安全检查员考虑安装安全导轨。当我们不需要时,我们显然不想重复完整的无条件请求。

但是,此行为具有时间组件。如果我们将后续请求延迟一秒,那么IE将在适当的时候重新请求,而Firefox将尊重max-age并过期标题,而不是在不必要时重新请求。

因此,如果两个请求可能在彼此的一秒内(我们知道它们是从同一个函数调用的,或者有两个事件可能连续触发它),使用setTimeout来延迟第一个完成后第二个的第二个请求将使其正确使用缓存,而不是两种不同的错误行为。

当然,第二次延迟是第二次延迟。这可能是一个大问题,主要取决于下载的实体的大小。

另一种可能性是,变化如此之快的东西不应该被建模为完全获取资源的状态,而是将当前状态的请求发布到资源。这确实有很多滥用REST和POST的内容,但实际应该是GET。

这可能意味着总的来说,这就是向搜索字符串添加随机内容的THIS IS SPARTA方法。这取决于,真的。