題記:一個cookie,整個下午都沒有找到解決的辦法。
一、遇到的問題
1. 情景:訪問http://list.mall.daily.taobao.net/50024400/xxx,當前頁面通過ajax請求廣告,請求的域為http://tmatch.simba.taobao.com/xxx;廣告引擎向頁面種seesion范圍的cookie名_back,用于標識翻頁;
2. 問題:
點擊當前頁面的翻頁,IE下廣告不翻頁?通過firebug與httpwatch對比,發現IE下cookie“_back”不正確。開始猜測是引擎種cookie的邏輯存在問題,但很多地方都在使用此接口,均沒有問題。
且有人的機器翻頁正常,此時懷疑是瀏覽器設置問題?再用httpwatch觀察“http請求頭”,發現_back沒有回傳給引擎(其實httpwatch的cookies也可以觀察到,如果發送cookie的話,會顯示為Sent;之前只觀察到Received)? 確認是瀏覽器的問題。
3. 解決:打開IE隱私設計,通常默認設置為“中”,拒絕“沒有隱私政策的第三方cookie ...”,意味著_back并沒有成功寫入客戶端,所有請求引擎導致不能正確回傳_back,翻頁失敗。
這么說淘寶所有的廣告的翻頁都是不可用的 ?肯定不是。問題在”第一方 Cookie 來自您正瀏覽的網站,它們可以是永久的或臨時的;第三方 Cookie 來自您正瀏覽的網站上的其他網站的廣告”,對于瀏覽器“taobao.net與taobao.com”就是不同的兩個網站,所以引擎的_back是無法種在客戶端。此情景是daliy環境,線上的環境訪問的是list.mall.daily.taobao.com,所以不存在“第三方cookie”的概念,廣告是可以正確顯示。
二、關于cookie小知識
1.IE Cookie的格式
第一行“名稱”,第二行“值”,第三行“所屬域” ...比如“.taobao.com”存在cna,此cookie會被瀏覽器自動發送到任何屬于此域的子域;www.taobao.com\taobao.com,后面的是根域,前一個是二級域。xp存放目錄為:C:\Documents and Settings\<username>\Cookies\,文件命名:你的用戶名@生成COOKIE的domain[COOKIE改變的次數].txt
參考:http://blog.csdn.net/zhangxinrun/archive/2010/07/31/5779574.aspx
2.Js Cookie跨域訪
http://blog.csdn.net/tongdoudpj/archive/2009/05/10/4166096.aspx
3.cookie與session的關系
根本的原因:http協議的無狀態性,cookie的出現就是為了解決這個問題。
session是一種在客戶端與服務器之間保持狀態的解決方案。服務端存儲內容,返回對應的key給客戶端,當下次訪問時,帶上此key,實現狀態的維持。
session實現:
1.依賴cookie,The session cookie is stored in temporary memory and is not retained after the browser is closed。(實際測試:IE8,未在1描述的位置找到session級別cookie對應的文件,猜測‘臨時存儲在瀏覽器內存’,當關閉瀏覽器時則丟失key)
2.url重寫。Servlet規范定義此功能。當瀏覽器禁用cookie時,就算session級別的內容也不會被存儲。resp.encodeRedirectURL(url),且僅當禁用cookie時有效,重寫結果如:http://www.demo.com/cookie.do;jsessionid=19gfy1sg740dl1whwd72lbqlhb
疑問:server如何判斷,是否需要重寫呢?從實驗現象看,判斷是否收到name=JSESSIONID 的cookie,若無,則進行url重寫。
最好的方式,翻翻tomcat、jetty的源碼實現,但未找到對應的代碼。
關于cookie的詳細信息參見: http://en.wikipedia.org/wiki/HTTP_cookie