深入分析跨域cookie的問題

2021-04-12 22:34:48 字數 1300 閱讀 3098

背景: a**(j2ee,網域名稱a.yourdomain),b**(rails,網域名稱b.yourdomain),為了使a**和b**登陸同步,我們決定採用cookie進行統一管理,在我們的應用中,一般是a**產生cookie,b**會修改和刪除cookie

在刪除cookie時 我們遇到乙個很怪的問題就是b**無法刪除a**建立的cookie

我們通過如下方法:

1)cookies[:ut]=

(此時瀏覽器確實在執行此動作前傳送了cookie,值為x,返回的結果確實是此cookie變成了空,但再次傳送請求的時候又傳送x)

或者2)cookies[:ut]=nil

(此時瀏覽器確實在執行此動作前傳送了cookie,值為x,返回的結果確實是此cookie變成了空,但再次傳送請求的時候又傳送了兩個cookie,乙個為x,乙個為空,伺服器這邊接受到的是x)

或者3)cookies.delete :ut

(此時瀏覽器確實在執行此動作前傳送了cookie,值為x,返回的結果確實是此cookie變成了空,但再次傳送請求的時候又傳送x)和1情況相同

都不行後來發現

def clear_ut_cookie

cookies[:ut]=

這樣寫是可以的,也就是說必須加上:domain=>"yourdomain"

同樣的道理,在修改時也是這樣,如果不加上:domain=>"yourdomain",瀏覽器發請求送出cookie a, 伺服器請求完畢,瀏覽器會接受到cookie b,然後瀏覽器再次發請求,這時會傳送cookie a和cookie b 此後你會發現cookie b一直在變,cookie  a  保持不變

總結:做cookie操作最好指定domain,否則跨域的修改和修改不會生效。從上面的各種實踐可以看出:如果不指定domain,那麼伺服器返回的cookie並不會覆蓋瀏覽器中已有的cookie,雖然是同名cookie,但域不同,接著瀏覽器傳送請求的時候,會將兩個cookie同時傳送,但伺服器只會處理其中乙個,那就是指定域的。

這個最根本性的原理也解釋了為什麼會出現上面三種問題

1)沒有指定域,但有:expires=>-1.days.from_now,所以第一次請求的時候是cookie a,伺服器返回的是cookie b,但cookie b 並沒有覆蓋cookie a,但因為有:expires,會立馬過期,所以傳送的時候只會傳送cookie a

2)沒有指定域,沒有expire,所以第一次請求的是cookie a 伺服器返回的是cookie b,但cookie b 並沒有覆蓋cookie a,且cookie b 無:expires, 所以傳送的時候會傳送cookie a和cookie b。。。。。。

3)和1)同

深入分析跨域cookie的問題

背景 a j2ee,網域名稱a.yourdomain b rails,網域名稱b.yourdomain 為了使a 和b 登陸同步,我們決定採用cookie進行統一管理,在我們的應用中,一般是a 產生cookie,b 會修改和刪除cookie 在刪除cookie時 我們遇到乙個很怪的問題就是b 無法刪...

深入分析跨域cookie的問題

背景 a j2ee,網域名稱a.yourdomain b rails,網域名稱b.yourdomain 為了使a 和b 登陸同步,我們決定採用cookie進行統一管理,在我們的應用中,一般是a 產生cookie,b 會修改和刪除cookie 在刪除cookie時 我們遇到乙個很怪的問題就是b 無法刪...

深入分析跨域cookie的問題

背景 a j2ee,網域名稱a.yourdomain b rails,網域名稱b.yourdomain 為了使a 和b 登陸同步,我們決定採用cookie進行統一管理,在我們的應用中,一般是a 產生cookie,b 會修改和刪除cookie 在刪除cookie時 我們遇到乙個很怪的問題就是b 無法刪...