3

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

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

有没有办法强制浏览器执行所有请求而不进行缓存?我正在使用 Internet Explorer 8.0

谢谢

4

3 回答 3

8

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

因此,而不是:

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

我将使用:

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

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

于 2010-10-15T12:39:03.773 回答
7

并不真地。这是 IE 的一个已知问题,经典的解决方案是在每个请求的查询字符串末尾附加一个随机参数。如果您要求大多数 JS 库在本地执行此操作(cache:false例如,jQuery 的 AJAX 选项)

于 2010-10-15T12:38:58.500 回答
2

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

正如您已经发现的那样,存在一个问题,即从同一文档到同一 URI 的后续 GET(如在 DOM 文档生命周期中,重新加载页面,您将在该 XMLHttpRequest 请求中获得另一次尝试)。几乎 IE 似乎将其视为对同一图像或网页中其他相关资源的多个副本的请求;即使实体不可缓存,它也会使用缓存版本。

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

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

但是,此行为具有时间分量。如果我们将后续请求延迟一秒,那么 IE 将在适当的时候重新请求,而 Firefox 将遵守 max-age 和 expires 标头,并且在不需要时不会重新请求。

因此,如果两个请求可能在一秒钟之内(我们知道它们是从同一个函数调用的,或者有两个事件连续触发它的机会),则使用在第一个请求之后将setTimeout第二个请求延迟一秒has completed将使其正确使用缓存,而不是在两种不同类型的不正确行为中。

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

另一种可能性是,变化如此之快的东西根本不应该被建模为获取资源的状态,而是将当前状态的请求发布到资源。这确实有一股滥用 REST 和发布真正应该是 GET 的味道的味道。

这可能意味着总的来说,将随机内容附加到查询字符串的 THIS IS SPARTA 方法是可行的方法。这取决于,真的。

于 2010-10-15T13:53:08.470 回答