2013-05-07 113 views
1

我有一个多站点设置,其中每个站点通过ajax加载它的数据。一切都在工作完美期待一个细节。如果我按下后退按钮,则从浏览器缓存中加载ajax数据,而不是从服务器加载。这是有问题的,因为用户可能导航到第二个页面,改变状态并导航回到他想要查看概览中的改变的上一页面(例如,接受的任务图表现在具有一个被接受的任务,因为他接受了它) )。导航形式页面清除浏览器缓存

  1. 最常见的解决方案,我发现被(经由cache: false属性jQuery中)将时间戳附加到AJAX 请求。然而,这个 的缺点是它禁用了我不想做的http缓存(statuscode 304)。另外我需要304状态码,而不是 在其他情况下更新我的视图。

  2. 在用户离开网页时,第二个选择是结合window.onbeforeunload和显示 警告消息。这会使浏览器缓存失效,以便完成请求(不添加时间戳),即使按下了后退按钮 。缺点是用户每次从页面导航时都会收到确认对话框 (这非常烦人)。对于 安全原因,我无法通过JavaScript进行确认,如果我没有 显示消息,则缓存不会失效。

是否有更多的技巧来无效broser缓存/确保Ajax请求真正转到服务器?

如果有人不想尝试我们的,这里是onbeforeunload的示例代码。在您的网络追踪工具(例如Fiddler)中,当用户使用后退按钮导航到页面时,您会认为请求发送到服务器。如果你注意return 'Hello world';你不会。 (请注意,在这两种情况下,您都会在浏览器调试器网络跟踪器中看到它,但这不代表实际发送到服务器的代表性)。

​​

回答

0

您可以在jQuery的像添加时间戳Ajax请求该

data: { 'time': new Date().getTime() } 
+0

请阅读我的第一点.... – Stefan 2013-05-07 14:25:27

0

您可以添加缓存:假以Ajax调用以防止缓存

 $.ajax({ 
     type: "GET", 
     url: "test", //doesn't matter if it is invalid 
     cache: false, 
     success: function (data) { 

     } 
    }); 

这是通过添加和& _ =请求结束时的时间戳。当它迫使一个新的请求被发送到服务器,这是你以后的。它还具有将请求添加到浏览器缓存的副作用。所以,如果你正在做出很多这样的请求,它可能会以很多小的Ajax请求来污染缓存。

+0

请阅读我的第一点.... – Stefan 2013-05-07 14:26:02

+0

抱歉错过了,会仔细看下一次。 – 2013-05-07 14:29:19

+0

np。我其实预期了这个答案几次。希望最终的解决方案也将如此简单:D – Stefan 2013-05-07 14:30:59