2010-10-15 155 views
3

我实现了REST服务,并使用网页作为客户端。 我的页面有一些javascript函数,它执行几次相同的http请求到REST服务器并处理回复。禁用浏览器缓存

我的问题是,浏览器缓存的第一个答复,而不是actualy发送如下请求..

是否有某种方式来强制浏览器中执行没有缓存的所有要求? 我使用Internet Explorer 8.0

感谢

回答

8

不知道它是否可以帮助你,但有时,我在我的请求的URL中添加一个随机参数,以避免被缓存。

其所以不是:

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

我会用:

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

,该random的价值是为每个请求的不同。您可以以毫秒为单位使用当前时间。

7

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

2

那么,你当然不想完全禁用浏览器缓存;正确的缓存是REST的关键部分,并且它可以(如果客户端和服务器都正确地遵循)允许高度缓存,同时对缓存过期和重新验证进行良好控制,这是一个关键优势。

虽然你已经发现了一个问题,但随后的GET从相同的文档获取相同的URI(如在DOM文档生命周期中,重新加载页面,你将得到另一个XMLHttpRequest请求)。很多IE浏览器似乎将它视为在网页中请求同一图像或其他相关资源的多个副本;即使实体不可缓存,它也会使用缓存版本。

Firefox有相反的问题,即使缓存信息说不应该发送后续请求!

我们可以在每个请求的查询字符串末尾添加一个随机或带时间戳的伪造参数。然而,这有点像尖叫“这是斯巴达!”并将我们来之不易的下载踢进一个没有健康安全检查员考虑放置安全导轨的深坑中。当我们不需要时,我们显然不想重复一个完整的无条件请求。

但是,此行为有一个时间组件。如果我们将后续请求延迟一秒,那么IE会在适当的时候重新请求,而Firefox将遵守max-age和expires标题,而不必在不必要时重新请求。因此,如果两个请求可能在彼此的一秒之内(或者我们知道它们是从相同的函数调用的,或者有两个事件可能会紧密地连续触发),那么使用setTimeout来延迟第二个请求第一个第一个完成后会使其正确使用缓存,而不是两种不同的错误行为。

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

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

这可能意味着总的来说,这是将SPARTA随机填充到查询字符串的方法。这取决于,真的。