http304状态码缓存设置问题
生活随笔
收集整理的這篇文章主要介紹了
http304状态码缓存设置问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
當瀏覽器第一次加載資源的時候,返回一般為200,意思是成功獲取資源,并會在瀏覽器的緩存中記錄下max-age,第二次訪問的時候:
如果只是用瀏覽器打開,那么瀏覽器會去判斷這個資源在緩存里有沒有,如果有的話,會去判斷max-age,看看過期沒有,如果沒有過期,則直接讀緩存,根本不會和服務(wù)器進行交互,換句話說,斷網(wǎng)都能打開,就和本地跑一樣!如果已經(jīng)過期了,那就去服務(wù)器請求,等待服務(wù)器響應(yīng),這是很費時間的,服務(wù)器如果發(fā)現(xiàn)資源沒有改變過,那么就會返回304,告訴瀏覽器,我沒變過,你去讀緩存吧,于是瀏覽器也不用從服務(wù)器拉數(shù)據(jù)了,然而,等待服務(wù)器響應(yīng)也是一個很要命的問題,在網(wǎng)速發(fā)達的今天,等一個響應(yīng),有時比下載還慢。 如果是用瀏覽器刷新的,那么瀏覽器不會去判斷max-age了,直接去服務(wù)器拿,如果服務(wù)器判斷資源沒變過,則還是會返回304,和上面是一樣的,所以刷新一下,其實很可怕,等于把所有的資源都要去服務(wù)器請求一邊,問問服務(wù)器我過期了沒有。
綜上,盡量減少網(wǎng)頁的資源數(shù)量!盡量合并JS CSS 圖片!響應(yīng)速度將會猛增!
打算將cache-control的各個值都試一遍,看看最終效果是否和預(yù)期一致。?
?? 先嘗試max-age。其作用是:假如請求了服務(wù)器并在a時刻返回響應(yīng)結(jié)果,則在max-age規(guī)定的秒數(shù)內(nèi),瀏覽器將不會發(fā)送對應(yīng)的請求到服務(wù)器,數(shù)據(jù)由緩存直接返回;超過這一時間段才進一步由服務(wù)器決定是返回新數(shù)據(jù)還是仍由緩存提供。?
?? 設(shè)置max-age的方式是tomcat的filter。?
Java代碼??package?itims;?? public?class?TestHTTP?implements?Filter{?? ????private?static?transient?Log?logger?=?LogFactory.getLog(TestHTTP.class);??? ????@Override?? ????public?void?destroy()?{?? ?????????? ????}?? ?? ????@Override?? ????public?void?doFilter(ServletRequest?servletrequest,?? ????????????ServletResponse?servletresponse,?FilterChain?filterchain)?? ????????????throws?IOException,?ServletException?{?? ????????filterchain.doFilter(servletrequest,?servletresponse);?? ????????if?(servletrequest?instanceof?HttpServletRequest?&&?servletresponse?instanceof?HttpServletResponse)?{???? ????????????HttpServletRequest?request?=?(HttpServletRequest)?servletrequest;???? ????????????HttpServletResponse?response?=?(HttpServletResponse)?servletresponse;???? ?????????????logger.info("request.getRequestURI:"+request.getRequestURI());?? ????????????????response.setHeader("Cache-Control",?"max-age="?+?cacheTime);???? ????????}?? ????}?? ????@Override?? ?????public?void?init(FilterConfig?arg0)?throws?ServletException?{????? ?????????}??? }??
web.xml,只針對js和css文件進行設(shè)置。?
Xml代碼??<filter>?? ?????<filter-name>cache-filter</filter-name>?? ?????<filter-class>itims.TestHTTP</filter-class>?? ?????<init-param>?? ???????????<param-name>cache-time</param-name>?? ???????????<param-value>30</param-value>?? ????????</init-param>?? </filter>?? ?? <filter-mapping>?? ???????<filter-name>cache-filter</filter-name>?? ???????<url-pattern>*.js</url-pattern>?? ???</filter-mapping>?? ????? ???<filter-mapping>?? ???????<filter-name>cache-filter</filter-name>?? ???????<url-pattern>*.css</url-pattern>?? </filter-mapping>??
httpTest.jsp?
Html代碼??<%@?page?language="java"?contentType="text/html;?charset=ISO-8859-1"?? ????pageEncoding="ISO-8859-1"%>?? <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd">?? <%?? ????String?path?=?(String)?request.getContextPath();?? %>?? <html>?? ????<head>?? ????????<!--??? ????????<meta?http-equiv="refresh"?content="5;url=http://localhost:8088/itims/testRRD.action">? ????????-->?? ????????<meta?http-equiv="Content-Type"?content="text/html;?charset=ISO-8859-1"?/>?? ????????<script?type="text/javascript"?src="<%=path%>/widget/jquery/jquery-1.3.2.min.js"></script>?? ????????<title>httpTest</title>?? ????</head>?? ????<body>?? ????????<p>?? ????????????success!?? ????????</p>?? ????</body>?? </html>??
在瀏覽器內(nèi)輸入httpTest.jsp,則抓取的請求/響應(yīng)信息如下:?
Java代碼??http://localhost:8088/itims/widget/jquery/jquery-1.3.2.min.js?? ?? GET?/itims/widget/jquery/jquery-1.3.2.min.js?HTTP/1.1?? Host:?localhost:8088?? User-Agent:?Mozilla/5.0?(Windows?NT?5.1;?rv:6.0)?Gecko/20100101?Firefox/6.0?? Accept:?*/*?? Accept-Language:?zh-cn,zh;q=0.5?? Accept-Encoding:?gzip,?deflate?? Accept-Charset:?GB2312,utf-8;q=0.7,*;q=0.7?? Connection:?keep-alive?? Referer:?http://localhost:8088/itims/springTest.jsp?? Cookie:?JSESSIONID=4B83B20F13BBCD37D1C0FB406807FA75?? If-Modified-Since:?Sun,?28?Aug?2011?13:06:44?GMT?? If-None-Match:?W/"57254-1314536804640"?? ?? HTTP/1.1?304?Not?Modified?? Server:?Apache-Coyote/1.1?? Etag:?W/"57254-1314536804640"?? Cache-Control:?max-age=30?? Date:?Sun,?28?Aug?2011?13:19:35?GMT??
jquery-1.3.2.min.js的max-age被設(shè)置為30秒。即30秒內(nèi),無論用戶在瀏覽器地址欄上敲多少次回車,后臺也不應(yīng)該打印日志,而我這個信息抓取工具也不應(yīng)該抓取到任何信息。事實的確如此。注意,不同的操作方式影響最終結(jié)果,原因是刷新和強制刷新會額外發(fā)送cache-control信息。?
f5或刷新按鈕:cache-control:max-age=0?
ctrl+f5:cache-control:no-cache?
??????? pragma:no-cache?
疑難雜癥:?
1、為什么把緩存清干凈并訪問頁面后,再次通過按回車訪問頁面時,瀏覽器卻不再發(fā)送請求了,而按f5又可以??
?? 答:觀察響應(yīng)信息可知,把緩存清干凈后cache-control的設(shè)置消失了,原因不明。如果按回車,則此時緩存永遠都起作用,自然不用訪問服務(wù)器;而按f5則是強制訪問,且此時cache-control的設(shè)置又能出現(xiàn),所以之后所有的訪問都遵循cache-control的設(shè)置。
如果只是用瀏覽器打開,那么瀏覽器會去判斷這個資源在緩存里有沒有,如果有的話,會去判斷max-age,看看過期沒有,如果沒有過期,則直接讀緩存,根本不會和服務(wù)器進行交互,換句話說,斷網(wǎng)都能打開,就和本地跑一樣!如果已經(jīng)過期了,那就去服務(wù)器請求,等待服務(wù)器響應(yīng),這是很費時間的,服務(wù)器如果發(fā)現(xiàn)資源沒有改變過,那么就會返回304,告訴瀏覽器,我沒變過,你去讀緩存吧,于是瀏覽器也不用從服務(wù)器拉數(shù)據(jù)了,然而,等待服務(wù)器響應(yīng)也是一個很要命的問題,在網(wǎng)速發(fā)達的今天,等一個響應(yīng),有時比下載還慢。 如果是用瀏覽器刷新的,那么瀏覽器不會去判斷max-age了,直接去服務(wù)器拿,如果服務(wù)器判斷資源沒變過,則還是會返回304,和上面是一樣的,所以刷新一下,其實很可怕,等于把所有的資源都要去服務(wù)器請求一邊,問問服務(wù)器我過期了沒有。
綜上,盡量減少網(wǎng)頁的資源數(shù)量!盡量合并JS CSS 圖片!響應(yīng)速度將會猛增!
3xx?(重定向)?
要完成請求,需要進一步操作。通常,這些狀態(tài)碼用來重定向。Google 建議您在每次請求中使用重定向不要超過 5 次。您可以使用網(wǎng)站管理員工具查看一下 Googlebot 在抓取重定向網(wǎng)頁時是否遇到問題。診斷下的網(wǎng)絡(luò)抓取頁列出了由于重定向錯誤導(dǎo)致 Googlebot 無法抓取的網(wǎng)址。
| 300(多種選擇) | 針對請求,服務(wù)器可執(zhí)行多種操作。服務(wù)器可根據(jù)請求者 (user agent) 選擇一項操作,或提供操作列表供請求者選擇。 |
| 301(永久移動) | 請求的網(wǎng)頁已永久移動到新位置。服務(wù)器返回此響應(yīng)(對 GET 或 HEAD 請求的響應(yīng))時,會自動將請求者轉(zhuǎn)到新位置。您應(yīng)使用此代碼告訴 Googlebot 某個網(wǎng)頁或網(wǎng)站已永久移動到新位置。 |
| 302(臨時移動) | 服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來響應(yīng)以后的請求。此代碼與響應(yīng) GET 和 HEAD 請求的 301 代碼類似,會自動將請求者轉(zhuǎn)到不同的位置,但您不應(yīng)使用此代碼來告訴 Googlebot 某個網(wǎng)頁或網(wǎng)站已經(jīng)移動,因為 Googlebot 會繼續(xù)抓取原有位置并編制索引。 |
| 303(查看其他位置) | 請求者應(yīng)當對不同的位置使用單獨的 GET 請求來檢索響應(yīng)時,服務(wù)器返回此代碼。對于除 HEAD 之外的所有請求,服務(wù)器會自動轉(zhuǎn)到其他位置。 |
| 304(未修改) | 自從上次請求后,請求的網(wǎng)頁未修改過。服務(wù)器返回此響應(yīng)時,不會返回網(wǎng)頁內(nèi)容。 如果網(wǎng)頁自請求者上次請求后再也沒有更改過,您應(yīng)將服務(wù)器配置為返回此響應(yīng)(稱為 If-Modified-Since HTTP 標頭)。服務(wù)器可以告訴 Googlebot 自從上次抓取后網(wǎng)頁沒有變更,進而節(jié)省帶寬和開銷。 . |
| 305(使用代理) | 請求者只能使用代理訪問請求的網(wǎng)頁。如果服務(wù)器返回此響應(yīng),還表示請求者應(yīng)使用代理。 |
| 307(臨時重定向) | 服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來響應(yīng)以后的請求。此代碼與響應(yīng) GET 和 HEAD 請求的 <a href=answer.py?answer=>301</a> 代碼類似,會自動將請求者轉(zhuǎn)到不同的位置,但您不應(yīng)使用此代碼來告訴 Googlebot 某個頁面或網(wǎng)站已經(jīng)移動,因為 Googlebot 會繼續(xù)抓取原有位置并編制索引。 |
?? 先嘗試max-age。其作用是:假如請求了服務(wù)器并在a時刻返回響應(yīng)結(jié)果,則在max-age規(guī)定的秒數(shù)內(nèi),瀏覽器將不會發(fā)送對應(yīng)的請求到服務(wù)器,數(shù)據(jù)由緩存直接返回;超過這一時間段才進一步由服務(wù)器決定是返回新數(shù)據(jù)還是仍由緩存提供。?
?? 設(shè)置max-age的方式是tomcat的filter。?
Java代碼??
web.xml,只針對js和css文件進行設(shè)置。?
Xml代碼??
httpTest.jsp?
Html代碼??
在瀏覽器內(nèi)輸入httpTest.jsp,則抓取的請求/響應(yīng)信息如下:?
Java代碼??
jquery-1.3.2.min.js的max-age被設(shè)置為30秒。即30秒內(nèi),無論用戶在瀏覽器地址欄上敲多少次回車,后臺也不應(yīng)該打印日志,而我這個信息抓取工具也不應(yīng)該抓取到任何信息。事實的確如此。注意,不同的操作方式影響最終結(jié)果,原因是刷新和強制刷新會額外發(fā)送cache-control信息。?
f5或刷新按鈕:cache-control:max-age=0?
ctrl+f5:cache-control:no-cache?
??????? pragma:no-cache?
疑難雜癥:?
1、為什么把緩存清干凈并訪問頁面后,再次通過按回車訪問頁面時,瀏覽器卻不再發(fā)送請求了,而按f5又可以??
?? 答:觀察響應(yīng)信息可知,把緩存清干凈后cache-control的設(shè)置消失了,原因不明。如果按回車,則此時緩存永遠都起作用,自然不用訪問服務(wù)器;而按f5則是強制訪問,且此時cache-control的設(shè)置又能出現(xiàn),所以之后所有的訪問都遵循cache-control的設(shè)置。
轉(zhuǎn)載于:https://www.cnblogs.com/panxuejun/p/5842069.html
總結(jié)
以上是生活随笔為你收集整理的http304状态码缓存设置问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 又一款代替PanDownload的百度网
- 下一篇: ad18添加许可证无反应怎么回事