2012-05-17 28 views
3

这是一些示例代码。连续制作四个xmlhttprequests()到同一个url。在这种情况下,我预计有四个请求会有四个不同的响应,因为在这种情况下,URL会在每次调用时返回一个新的UUID。在Chrome 18,Firefox和Safari中,会发生这种情况。Chrome 19中的XMLHttpRequest行为有所不同 - '欺骗'请求?

在Chrome中19,但是,只有一个请求会在电线上,但浏览器的行为如同所有四项要求以相同的值返回。也就是说,回调被执行四次,但每次都有相同的响应文本。开发人员工具和Wireshark都确认实际上只有一个请求。我认为这可能与浏览器缓存行为有关,但是同时使用客户端(杂注:无缓存)和服务器端(缓存控制:无缓存)没有帮助。为每个请求添加一个不同的伪造查询参数会强制它做出所有四个实际的请求,但我仍然好奇什么改变了,以及处理它的另一种方式可能是什么(除了URL参数)。我也怀疑自己在做一些奇怪或错误的事情,因为我无法找到其他人在谈论这件事。

<!doctype HTML> 
<script> 
    function doOne(i) { 
    var xh = new XMLHttpRequest(); 
    xh.open("GET", "/uuid", true); 
    xh.setRequestHeader("pragma", "no-cache"); 
    xh.onreadystatechange = function() { 
     if (xh.readyState == 4) { 
     var p = document.createElement('p'); 
     p.innerHTML = xh.responseText; 
     document.body.appendChild(p); 
     } 
    } 
    xh.send(null); 
    } 
    window.onload = function() { 
    for (var i = 0; i < 4; i++) { 
     doOne(i); 
    } 
    } 
</script> 

供参考,在这里是我使用的是什么这个测试情况下,例如服务器(web.py):

#!/usr/bin/env python 

import uuid 
import web 

urls = (
    '/uuid', 'Uuid', 
) 

class Uuid(): 
    def GET(self): 
    web.header('Cache-Control', 'no-cache'); 
    return str(uuid.uuid1()) 

app = web.application(urls, globals()) 

if __name__ == '__main__': 
    app.run() 
+0

试着发送下一个全部响应(服务器)的报头_“没有缓存” _。 'Cache-Control:no-cache','Date:GMT current time here' _(例如,Date:Thu,2012年5月17日05:44:24 GMT)_,'Expires:-1','Pragma:no -cache' –

+0

@AndrewD。感谢您的评论;编译指示:no-cache用于请求,而不是响应,在示例代码中,我将它设置为请求。对于缓存控制,我也尝试了无存储,这没有帮助。 – slowslowslow

+0

'pragma'可以同时用于:请求和响应。你也可以简单地检查它:在谷歌上找到一些东西,然后在网络选项卡上检查FF firebug或Chrome DevTools。通过'Cache-Control:no-cache'寻求响应。在所有使用'Cache-Control:no-cache'的响应中,你都可以看到'Pragma:no-cache'。 –

回答

0

我已经看到我的Rails内使用Chrome 19相同的问题应用。为了解决这个问题,我的代码工作正常:

before_filter :set_cache_buster 
def set_cache_buster 
    if request.xhr? 
    response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate" 
    response.headers["Pragma"] = "no-cache" 
    response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" 
    end 
end 

它禁用每个XMLHttpRequest的缓存。

学分:http://blog.serendeputy.com/posts/how-to-prevent-browsers-from-caching-a-page-in-rails/

+0

呃这里的评论系统。上面的混乱道歉。主要的一点是我尝试了一系列头文件,确认它们正如预期的那样放在电线上,但它们不适合我。 – slowslowslow

0

近日偶然发现了这也并没有发现强迫Chrome浏览器不重用响应的好方法。 Firefox似乎没有这种行为。

我已提起chromium issue,希望有人能说清楚,如果这是预期的行为或错误。

+1

该问题在Chrome 34中部分修复,并完全固定在Chrome 35中。不幸的是,Android 4.4的WebView是Chrome 33,仍然存在问题。Chrome浏览器应用程序的更新不会更新嵌入WebView GUI组件的其他应用程序使用的副本,因此这些应用程序停留在Chrome 33上。这会影响仍支持Android 4的Android开发人员,因此建议您调用浏览器。如果'android.os.Build.VERSION.SDK'为19(或者可能在下面;我不知道是否有人检查过哪个版本的Chrome是第一个版本的Chrome)。 –