IE下javascript cookie path設置Bug

項目中設置完cookie,在Firefox下順利測試經過。IE測試出現問題,經定位發現是Javascript設置 Cookie 時的 path 有問題。IE下Cookie設置在 /或者URL所在路徑時正常,若是Cookie值做用域在當前URL下,則IE下javascript 沒法獲取到設置的Cookie值。 

看下面演示代碼,注意下面的path 區別:javascript

  1. var cookie_name = "name";  
  2. var cookie_value = "value";  
  3. expires = new Date();  
  4. expires.setTime(expires.getTime() + 86400 * 1000);  
  5.   
  6. // 有Bug document.cookie沒法讀取到cookie_name值  
  7. document.cookie = cookie_name + "=" + encodeURIComponent(cookie_value)  
  8.         + "; expires=" + expires.toGMTString() + "; path="  
  9.         + window.location.pathname;  
  10. // 正常  
  11. document.cookie = cookie_name + "=" + encodeURIComponent(cookie_value)  
  12.         + "; expires=" + expires.toGMTString() + "; path=/test/";  
  13. // 正常  
  14. document.cookie = "cookie_name=" + encodeURIComponent(cookie_value)  
  15.         + "; expires=" + expires.toGMTString() + "; path=/";  

 

得出結果:cookie值只對當前頁面有效。如今不知道html

 

替代方案,代碼:java

  1. //IE Cookie Bug 替代方案  
  2. var cookie_path = window.location.pathname;  
  3. var cookie_name = encodeURIComponent(cookie_path.substring(cookie_path  
  4.         .lastIndexOf('/') + 1));  
  5. cookie_path = cookie_path.substring(0, cookie_path.lastIndexOf('/') + 1);  
  6. var cookie_value = "value";  
  7. expires = new Date();  
  8. expires.setTime(expires.getTime() + 86400 * 1000);  
  9.   
  10. document.cookie = cookie_name + "=" + encodeURIComponent(cookie_value)  
  11.         + "; expires=" + expires.toGMTString() + "; path=" + cookie_path;  

 

替代方案根據每一個頁面的URL文件名來作Cookie名,有效範圍在當前頁路經下。
如:url 等於 /test/test.html
則cookie名爲test.html,有效路徑爲/test/
這樣也能夠作到同一個js部署在每一個頁面上能讀到只對當前URL有效的cookie值。代價是當用戶在同一級目錄下訪問不少頁面時會致使cookie值不 斷增大。結果是當前路徑下的每一個http請求都帶很長一段的cookie,直接致使服務器接收客戶端request的header長度增加,流量增加的同 時服務器負擔也變重。並且根據 RFC 2109的定義Cookie也有長度和個數限制,IE容許的最大 Cookie 長度是 4096 字節,容許50個Cookie 名-值對。若是要突破50個名-值對的限制,能夠在一個名-值使用Cookie字典的方式保存更多的Cookie變量。
服務器

  

參考自:http://conkeyn.iteye.com/blog/423549

相關文章
相關標籤/搜索