解決HTTP數(shù)據(jù)不更新問(wèn)題——no-cache在HTTP通信協(xié)議中的應(yīng)用收藏 收藏
來(lái)源:
http://blog.csdn.net/froole/archive/2009/02/13/3886957.aspx HTTP服務(wù)器向客戶(hù)端返回的頭信息中可以包含Cache-Control:no-cache信息,意為“數(shù)據(jù)內(nèi)容不被儲(chǔ)存”。很多WEB程序設(shè)計(jì)中,通常并不需要考慮這一點(diǎn)。但是,對(duì)相同URL的請(qǐng)求,并需要?jiǎng)討B(tài)數(shù)據(jù)時(shí),就需要程序員對(duì)服務(wù)器返回頭信息的進(jìn)行修改。例如,通過(guò)Ajax向同一個(gè)URL發(fā)送請(qǐng)求、頁(yè)面訪(fǎng)問(wèn)同一個(gè)URL并需要?jiǎng)討B(tài)顯示頁(yè)面內(nèi)容。在不對(duì)服務(wù)器所返回頭信息做任何修飾的情況下,Cache-Control可能不被添加,此時(shí),瀏覽器將緩存從服務(wù)器取得的信息。如果再次訪(fǎng)問(wèn)網(wǎng)頁(yè),瀏覽器會(huì)直接讀取緩存數(shù)據(jù),而非訪(fǎng)問(wèn)HTTP服務(wù)器,如果通過(guò)代理再次訪(fǎng)問(wèn)網(wǎng)頁(yè),那么,代理服務(wù)器將會(huì)直接向?yàn)g覽器返回一個(gè)302狀態(tài),命令瀏覽器從緩存讀取數(shù)據(jù)。 本文想定開(kāi)發(fā)人員遭遇以下兩種情況: 1.Ajax中,需要通過(guò)一個(gè)URL適時(shí)提取動(dòng)態(tài)數(shù)據(jù)(例如,使用DWR提取某個(gè)POJO的數(shù)據(jù)); 2.在一個(gè)網(wǎng)頁(yè)中,通過(guò)對(duì)某個(gè)連接的重復(fù)訪(fǎng)問(wèn)(發(fā)送請(qǐng)求),動(dòng)態(tài)讀取不同的頁(yè)面數(shù)據(jù)(例如,根據(jù)某個(gè)項(xiàng)目的列排序)。 如果可以在設(shè)計(jì)階段,就已經(jīng)考慮到通過(guò)URL參數(shù),改變URL,倒也不需要考慮緩存的問(wèn)題。但是,如果URL相同,就會(huì)出現(xiàn)相應(yīng)數(shù)據(jù)更新遲緩的現(xiàn)象。例如,如果訪(fǎng)問(wèn)速度相對(duì)較快,第一次訪(fǎng)問(wèn)和第二次訪(fǎng)問(wèn)的數(shù)據(jù),在同一個(gè)客戶(hù)端是相同的。也就是HTTP數(shù)據(jù)不更新/更新遲緩現(xiàn)象。解決此問(wèn)題的方法,就是向服務(wù)器的返回頭信息“Cache-Control:no-cache”。 PHP的情況,可以向相應(yīng)的返回處理中添加以下代碼: view plaincopy to clipboardprint? header("Cache-Control: no-cache"); header("Cache-Control: no-cache"); Java的情況,可以定義相應(yīng)的URL,通過(guò)操作HttpServletResponse定義頭信息,如下: view plaincopy to clipboardprint? public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ((HttpServletResponse) response).setHeader("Cache-Control", "no-cache"); chain.doFilter(request, response); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ((HttpServletResponse) response).setHeader("Cache-Control", "no-cache"); chain.doFilter(request, response); } 以上兩個(gè)例子,雖然是在不同語(yǔ)言下的實(shí)現(xiàn),但是從HTTP協(xié)議通信的角度,其效果是類(lèi)似的。 使用Cache-Control需要注意的通過(guò)控制Cache-Control頭信息,可以讓瀏覽器(代理服務(wù)器)及時(shí)更新請(qǐng)求數(shù)據(jù)。但是要注意的是,只有在HTTP1.1下才Cache-Control被支持。當(dāng)然,HTTP的版本在大多數(shù)WEB開(kāi)發(fā)中,同樣不需要考慮。而目前的主流瀏覽器也都是默認(rèn)支持HTTP1.1。但是,如果使用IE6,并且通過(guò)代理服務(wù)器訪(fǎng)問(wèn)網(wǎng)站的時(shí)候,瀏覽器的HTTP請(qǐng)求就要變成HTTP1.0了。這個(gè)時(shí)候,Cache-Control就會(huì)失效,而且無(wú)法從服務(wù)器端控制HTTP協(xié)議版本。只能通過(guò)瀏覽器的設(shè)定來(lái)解決,方法是,通過(guò)IE詳細(xì)設(shè)置中的HTTP1.1設(shè)定來(lái)解決。如果可能,也可以把目標(biāo)服務(wù)器排除在代理目標(biāo)之外。