cookie path

本文轉自:http://www.cnblogs.com/ainiaa/archive/2011/11/18/2253841.html


以前使用cookie的時候 沒有在意path的問題。這次公司商城實現了靜態化的功能,多了2級目錄。導致了我在商品詳情頁面設置好的cookie(path爲/good/商品ID/)在店鋪首頁竟然訪問不到(店鋪首頁的path爲'/store/')。cookie的名稱都是一致的。唯一不同的只有path。在商品詳情頁設置cookie的時候吧path設置成‘/’,這樣修改之後就可以正常的在店鋪首頁取到設置好的cookie了。

使用關鍵字 javascript cookie  path 還搜索到了,原來10年來IE一直存在一個cookie path的一個bug(原文地址:http://conkeyn.iteye.com/blog/423549)。

 

手上一個廣告項目,在Firefox下順利測試通過。自信JS代碼能兼容IE,FF測試過後隨手就仍給CS測試,結果CS反饋說有問題。排查一番,發現居然和Javascript 設置 Cookie 時的 path 有關。IE下Cookie種在/或者URL所在路徑時正常,如果Cookie值作用域在當前URL下則IE下javascript 無法獲取到設置的Cookie值。

看下面演示代碼:

 

  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=/";  

 

懷疑是IE的Bug、
在google上 搜了下關鍵詞: ie javascript cookie path bug
同樣的問題在罪與罰的博客上也有描述,而且博主聯繫過微軟IEBLOG的Eric。得到的回覆是:

You have uncovered an IE bug where cookies that are setwith a path that contains a filename (e.g. /page.htm) are notaccessible to the document.cookie function, although they are correctlysent to the server in the HTTP header. This has been broken for atleast 10 years and unfortunately probably will not be fixed in IE8.

Thanks,

-Eric

一個存在10年的Bug。。。而且IE8也不會修復,實在是無語。

需求是cookie值只對當前頁面有效,沒辦法只好用替代方案,看代碼:

 

  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://blog.seateng.cn/archives/2009/03/ie-javascript-cookie-path-bug.html

這次的靜態化功能讓我學到了cookie的這個問題。很是高興啊。

這次靜態化功能還涉及到了一個跨域請求的問題。事情是這樣的:

我在搜索模塊(域名search.emall.xxx.xxx)需要顯示當前用戶的商品瀏覽歷史。二者個商品瀏覽歷史是在主站的cookie裏面存儲的。爲了方便我們把COOKIE_DOMAIN都設置成了一樣的一級域名,使用js的cookie卻不能獲得設置好的cookie。但是,使用firebug + firecookie卻可以清楚的看到cookie是存在的且沒有過期。唯一不同的就好似cookie的domain和當前模塊的domain一致(cookie是在主站設置好的emall.xxx.xxx,當前search的域名爲search.emall.xxx.xxx)。 這很容易就讓人想到是cookie domain的問題導致的。問題原因找到了,解決它。使用js不行我就我就使用ajax的方式請求主站,在主站吧cookie取出來,然後再原樣的返回。編碼,運行,反先,ajax請求還是不能獲得(使用get的方式發送請求)。把ajax請求的地址放在地址欄裏面,確實有內容返回,但是使用ajax請求的話,還是不能獲得cookie的值。很顯然,這種情況就是傳說中的跨域請求的問題。這問題咱沒有解決過,怎麼辦那?突然想起來了,該模塊下用戶登錄信息就是通過ajax異步取出來的。同時ajax請求爲什麼用戶的登錄信息可以拿到我的爲什麼就拿不到???

找原因。找到請求用戶信息的代碼,才發現,原來請求的時候和我的ajax還有一點不一樣。請求用戶信息的方式爲:

JS代碼如下:

複製代碼
    //跨域獲取數據
     jQuery.ajax({
        type : "GET",
        url : temp_domain_url+"/index.php?",
        data   : "act=get_user_info&php_session_id="+jQuery.cookie('COOKIE_ID')+"&jsoncallback=?",
        dataType : "jsonp",
        jsonnp : 'callback',
        success:function(data){
      ...
      ...
      ...
    }
  });
複製代碼

php代碼如下:

複製代碼
function get_user_info()
{
    $gbh_goods_info = $_COOKIE['gbh_goods_info'] ? $_COOKIE['gbh_goods_info'] : json_encode(false);
        if ($gbh_goods_info && get_magic_quotes_gpc()) 
        {//沒有這個的話會出現錯誤
             $gbh_goods_info = stripslashes($gbh_goods_info);
        }
        $gbh_goods_info = json_decode($gbh_goods_info);
        echo $_GET['callback']."({msg: ".json_encode($gbh_goods_info)."});";
        exit;
    }
複製代碼

這才弄明白到底是什麼原因了。

照着葫蘆畫瓢終於吧功能實現了。。。。

 

參考:

cookie path問題相關

http://www.cftea.com/c/825.asp

http://webgroup.blog.163.com/blog/static/18874305120112150421688/

跨域請求相關問題:

http://wenku.baidu.com/view/315c51c66137ee06eff91856.html

http://www.cnblogs.com/JimmyGe/archive/2011/10/17/2215791.html

http://club.topsage.com/thread-2538598-1-1.html

http://www.chinaz.com/program/2010/0111/103511_4.shtml

http://blog.s135.com/ajaxcdr

http://www.iteye.com/topic/859280

http://site518.net/javascript-cross-domain-request/


發佈了37 篇原創文章 · 獲贊 16 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章