关于cookie domain中的点前缀
今天同事遇到一個問題,大概描述如下:
瀏覽器已經(jīng)接收指令,之前在一級域名下存儲了相關(guān)的信息。這里為了簡化問題,假設(shè)我們有兩個應(yīng)用A和B,域名分別為:a.b.com和c.a.b.com。(顯然B是A的一個子域)。
上面的描述就是:在.b.com這個一級域名下,我們已經(jīng)成功寫入了一個cookie,假設(shè)為:b=level1。
在正常用戶的瀏覽行為中,應(yīng)用A會向自己的域下寫入a=level2(domain:a.b.com)。
在A正常的頁面中,有些場景會有異步的請求發(fā)出到B應(yīng)用的頁面(用于獲取數(shù)據(jù)),合理的一種想法是: 發(fā)送到B應(yīng)用的請求,應(yīng)該攜帶著上面的b=level1,a=level2這兩個cookie信息到B應(yīng)用的服務(wù)器去才對。但是,實(shí)際的情況是,b=level1被如愿攜帶上來,但是a=level2這個信息卻被丟棄了!(確切的說是沒有跟著request一起被發(fā)送到B的服務(wù)端)。
為啥?在訪問子域應(yīng)用時,不是父域名下的cookie都應(yīng)該被攜帶上來嗎?就像上面的b=level1那樣?
其實(shí),關(guān)于這點(diǎn),在cookie的RFC規(guī)范中,并沒有太明顯的說明,至少我沒有看到,即使又看了一遍RFC6265中關(guān)于Domain Matching的描述也是如此。
但實(shí)際的使用過程中,某個域下的cookie如果希望能夠被他的子域具有可見性(即可以讀取),必須要注意的一點(diǎn)是,應(yīng)該保證這個cookie在被Set的時候,應(yīng)該以"."開頭。回到上面的例子,之所以a=level2這個cookie沒有在用戶瀏覽器請求B應(yīng)用時被攜帶到B的server端,就是因?yàn)閍=level2這個cookie的domain不是.a.b.com,而是a.b.com。
事實(shí)上,上面例子中的A應(yīng)用,在向自己的域名下寫入a=level2這個cookie時,壓根就沒有顯式的設(shè)置domain這個屬性,這樣一來,瀏覽器接受到這個Set Cookie的請求時,就會以默認(rèn)以當(dāng)前應(yīng)用的域名作為cookie的domain。(不過據(jù)說某些版本的Firefox到是會自作聰明的在當(dāng)前域名的前面自動加上一個點(diǎn),這個待驗(yàn)證!)
這一個小點(diǎn)的區(qū)別,還是很容易被忽略的,不過產(chǎn)生的瀏覽行為還是有細(xì)微差別的。(涉及到cookie是否上傳,是否占用網(wǎng)絡(luò)流量等)
PS:關(guān)于上面說到的那個問題,stackoverflow上的這個有個截圖,看著說明就直觀很多了。
總結(jié)
以上是生活随笔為你收集整理的关于cookie domain中的点前缀的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正确使用cookie中的domain
- 下一篇: 解决IE10以下对象不支持“bind“属