解決HTTP數(shù)據(jù)不更新問題——no-cache在HTTP通信協(xié)議中的應(yīng)用
發(fā)布時(shí)間:2009-02-14 14:03:41 作者:佚名
我要評(píng)論

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

相關(guān)文章
windows一鍵批量安裝字體腳本(基于fontreg工具)
不知道大家有沒有過,因?yàn)楣ぷ鬈浖蛘呙阑到y(tǒng)的需要一個(gè)個(gè)點(diǎn)擊安裝字體文件的恐懼支配過,往往需要花很多時(shí)間精力去一個(gè)個(gè)選擇,然后點(diǎn)擊字體文件安裝,這里就為大家分享2025-03-12奧維互動(dòng)地圖電腦版如何顯示地名?奧維互動(dòng)地圖顯示地名的方法
奧維互動(dòng)地圖瀏覽器是一款功能強(qiáng)大的跨平臺(tái)地圖瀏覽器,該軟件支持百度地圖、搜狗地圖、3D地圖、全球地圖離線下載、全球語音導(dǎo)航各種功能,本文中介紹的是使用這款軟件顯示2025-01-02如何將微信語音silk轉(zhuǎn)為mp3?兩款silk轉(zhuǎn)為mp3的軟件使用方法介紹
微信語音通常為silk格式,本文中介紹的是將silk格式轉(zhuǎn)換為mp3等,想了解的朋友不妨閱讀參考下2024-06-24- 匯幫注音大師支持添加漢字直接添加拼音,多種拼音樣式和結(jié)構(gòu),可一鍵導(dǎo)出word txt pdf 文件,支持添加文件進(jìn)行批量注音導(dǎo)出文件等,本文中介紹的是使用該軟件為漢字添加注音2024-06-24
如何給漢字加拼音不帶聲調(diào)?匯幫注音大師為漢字注音的方法
匯幫注音大師支持添加漢字直接添加拼音,多種拼音樣式和結(jié)構(gòu),可一鍵導(dǎo)出word txt pdf 文件,支持添加文件進(jìn)行批量注音導(dǎo)出文件等,本文中介紹的是使用這款軟件給漢字加拼音2024-06-24- 如何使用云端課堂軟件?云端課堂是一款好用的教育直播應(yīng)用,下文中為大家?guī)砹擞脜⒓哟a登錄云端課堂教室的方法,有需要的朋友不妨來看看這篇文章吧2024-06-18
如何為word文檔內(nèi)容添加拼音?星優(yōu)漢字注音器批量注音的方法
星優(yōu)漢字注音器批量注音在電腦中使用的漢字添加拼音的工具,本文中介紹的是使用該軟件批量為word文檔內(nèi)容添加拼音的方法2024-06-17如何為漢字添加拼音?星優(yōu)漢字注音器為漢字注音的方法
星優(yōu)漢字注音器能夠自定義注音結(jié)構(gòu),選擇是否帶聲調(diào)和后綴,還可設(shè)置分隔符等,本文中介紹的是使用這款軟件為漢字注音的方法,有需要的朋友不妨閱讀參考下2024-06-17抖店怎么注銷店鋪 抖店申請(qǐng)關(guān)店的詳細(xì)流程
抖店怎么注銷店鋪?抖店是一款抖音商家版的管理平臺(tái),專門本地門店打造的營(yíng)銷工具,比一般的推廣力度更大,下文中為大家?guī)砹硕兜晟暾?qǐng)關(guān)店的詳細(xì)流程,需要的朋友看看吧2024-06-12- 我們?cè)谑褂盟压份斎敕ǖ倪^程中,都會(huì)將我們的一些輸入記錄保存在里面,有些用戶可能比較感興趣,就想要查看輸入記錄,那么電腦搜狗輸入法如何查輸入記錄呢?下面給大家?guī)?/div> 2024-01-03
最新評(píng)論