http304狀態碼緩存設置問題


當瀏覽器第一次加載資源的時候,返回一般為200,意思是成功獲取資源,並會在瀏覽器的緩存中記錄下max-age,第二次訪問的時候:
如果只是用瀏覽器打開,那么瀏覽器會去判斷這個資源在緩存里有沒有,如果有的話,會去判斷max-age,看看過期沒有,如果沒有過期,則直接讀緩存,根本不會和服務器進行交互,換句話說,斷網都能打開,就和本地跑一樣!如果已經過期了,那就去服務器請求,等待服務器響應,這是很費時間的,服務器如果發現資源沒有改變過,那么就會返回304,告訴瀏覽器,我沒變過,你去讀緩存吧,於是瀏覽器也不用從服務器拉數據了,然而,等待服務器響應也是一個很要命的問題,在網速發達的今天,等一個響應,有時比下載還慢。
如果是用瀏覽器刷新的,那么瀏覽器不會去判斷max-age了,直接去服務器拿,如果服務器判斷資源沒變過,則還是會返回304,和上面是一樣的,所以刷新一下,其實很可怕,等於把所有的資源都要去服務器請求一邊,問問服務器我過期了沒有。
綜上,盡量減少網頁的資源數量!盡量合並JS CSS 圖片!響應速度將會猛增!

3xx (重定向) 
要完成請求,需要進一步操作。通常,這些狀態碼用來重定向。Google 建議您在每次請求中使用重定向不要超過 5 次。您可以使用網站管理員工具查看一下 Googlebot 在抓取重定向網頁時是否遇到問題。診斷下的網絡抓取頁列出了由於重定向錯誤導致 Googlebot 無法抓取的網址。

300(多種選擇) 針對請求,服務器可執行多種操作。服務器可根據請求者 (user agent) 選擇一項操作,或提供操作列表供請求者選擇。
301(永久移動) 請求的網頁已永久移動到新位置。服務器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。您應使用此代碼告訴 Googlebot 某個網頁或網站已永久移動到新位置。
302(臨時移動) 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來響應以后的請求。此代碼與響應 GET 和 HEAD 請求的 301 代碼類似,會自動將請求者轉到不同的位置,但您不應使用此代碼來告訴 Googlebot 某個網頁或網站已經移動,因為 Googlebot 會繼續抓取原有位置並編制索引。
303(查看其他位置) 請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,服務器返回此代碼。對於除 HEAD 之外的所有請求,服務器會自動轉到其他位置。
304(未修改)

自從上次請求后,請求的網頁未修改過。服務器返回此響應時,不會返回網頁內容。

如果網頁自請求者上次請求后再也沒有更改過,您應將服務器配置為返回此響應(稱為 If-Modified-Since HTTP 標頭)。服務器可以告訴 Googlebot 自從上次抓取后網頁沒有變更,進而節省帶寬和開銷。

.
305(使用代理) 請求者只能使用代理訪問請求的網頁。如果服務器返回此響應,還表示請求者應使用代理。
307(臨時重定向) 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來響應以后的請求。此代碼與響應 GET 和 HEAD 請求的 <a href=answer.py?answer=>301</a> 代碼類似,會自動將請求者轉到不同的位置,但您不應使用此代碼來告訴 Googlebot 某個頁面或網站已經移動,因為 Googlebot 會繼續抓取原有位置並編制索引。
 
  打算將cache-control的各個值都試一遍,看看最終效果是否和預期一致。 
   先嘗試max-age。其作用是:假如請求了服務器並在a時刻返回響應結果,則在max-age規定的秒數內,瀏覽器將不會發送對應的請求到服務器,數據由緩存直接返回;超過這一時間段才進一步由服務器決定是返回新數據還是仍由緩存提供。 
   設置max-age的方式是tomcat的filter。 
Java代碼   收藏代碼
  1. package itims;  
  2. public class TestHTTP implements Filter{  
  3.     private static transient Log logger = LogFactory.getLog(TestHTTP.class);   
  4.     @Override  
  5.     public void destroy() {  
  6.           
  7.     }  
  8.   
  9.     @Override  
  10.     public void doFilter(ServletRequest servletrequest,  
  11.             ServletResponse servletresponse, FilterChain filterchain)  
  12.             throws IOException, ServletException {  
  13.         filterchain.doFilter(servletrequest, servletresponse);  
  14.         if (servletrequest instanceof HttpServletRequest && servletresponse instanceof HttpServletResponse) {    
  15.             HttpServletRequest request = (HttpServletRequest) servletrequest;    
  16.             HttpServletResponse response = (HttpServletResponse) servletresponse;    
  17.              logger.info("request.getRequestURI:"+request.getRequestURI());  
  18.                 response.setHeader("Cache-Control", "max-age=" + cacheTime);    
  19.         }  
  20.     }  
  21.     @Override  
  22.      public void init(FilterConfig arg0) throws ServletException {     
  23.          }   
  24. }  

web.xml,只針對js和css文件進行設置。 
Xml代碼   收藏代碼
  1. <filter>  
  2.      <filter-name>cache-filter</filter-name>  
  3.      <filter-class>itims.TestHTTP</filter-class>  
  4.      <init-param>  
  5.            <param-name>cache-time</param-name>  
  6.            <param-value>30</param-value>  
  7.         </init-param>  
  8. </filter>  
  9.   
  10. <filter-mapping>  
  11.        <filter-name>cache-filter</filter-name>  
  12.        <url-pattern>*.js</url-pattern>  
  13.    </filter-mapping>  
  14.      
  15.    <filter-mapping>  
  16.        <filter-name>cache-filter</filter-name>  
  17.        <url-pattern>*.css</url-pattern>  
  18. </filter-mapping>  

httpTest.jsp 
Html代碼   收藏代碼
  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"  
  2.     pageEncoding="ISO-8859-1"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <%  
  5.     String path = (String) request.getContextPath();  
  6. %>  
  7. <html>  
  8.     <head>  
  9.         <!--   
  10.         <meta http-equiv="refresh" content="5;url=http://localhost:8088/itims/testRRD.action"> 
  11.         -->  
  12.         <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />  
  13.         <script type="text/javascript" src="<%=path%>/widget/jquery/jquery-1.3.2.min.js"></script>  
  14.         <title>httpTest</title>  
  15.     </head>  
  16.     <body>  
  17.         <p>  
  18.             success!  
  19.         </p>  
  20.     </body>  
  21. </html>  

在瀏覽器內輸入httpTest.jsp,則抓取的請求/響應信息如下: 
Java代碼   收藏代碼
  1. http://localhost:8088/itims/widget/jquery/jquery-1.3.2.min.js  
  2.   
  3. GET /itims/widget/jquery/jquery-1.3.2.min.js HTTP/1.1  
  4. Host: localhost:8088  
  5. User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0  
  6. Accept: */*  
  7. Accept-Language: zh-cn,zh;q=0.5  
  8. Accept-Encoding: gzip, deflate  
  9. Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7  
  10. Connection: keep-alive  
  11. Referer: http://localhost:8088/itims/springTest.jsp  
  12. Cookie: JSESSIONID=4B83B20F13BBCD37D1C0FB406807FA75  
  13. If-Modified-Since: Sun, 28 Aug 2011 13:06:44 GMT  
  14. If-None-Match: W/"57254-1314536804640"  
  15.   
  16. HTTP/1.1 304 Not Modified  
  17. Server: Apache-Coyote/1.1  
  18. Etag: W/"57254-1314536804640"  
  19. Cache-Control: max-age=30  
  20. Date: Sun, 28 Aug 2011 13:19:35 GMT  

jquery-1.3.2.min.js的max-age被設置為30秒。即30秒內,無論用戶在瀏覽器地址欄上敲多少次回車,后台也不應該打印日志,而我這個信息抓取工具也不應該抓取到任何信息。事實的確如此。注意,不同的操作方式影響最終結果,原因是刷新和強制刷新會額外發送cache-control信息。 
f5或刷新按鈕:cache-control:max-age=0 
ctrl+f5:cache-control:no-cache 
        pragma:no-cache 
疑難雜症: 
1、為什么把緩存清干凈並訪問頁面后,再次通過按回車訪問頁面時,瀏覽器卻不再發送請求了,而按f5又可以? 
   答:觀察響應信息可知,把緩存清干凈后cache-control的設置消失了,原因不明。如果按回車,則此時緩存永遠都起作用,自然不用訪問服務器;而按f5則是強制訪問,且此時cache-control的設置又能出現,所以之后所有的訪問都遵循cache-control的設置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM