1. 程式人生 > >自己寫Java Web遇到的坑(2)——刪除cookie時刪不掉

自己寫Java Web遇到的坑(2)——刪除cookie時刪不掉

問題

我們知道,新設定一個cookie,需要指定它的path(路徑),name(名字),和maxAge(存活時間)。對於maxAge(存活時間),有一些特殊的使用方法:設定成負數,代表當頁面關閉時銷燬cookie;設定成0,代表刪除一個cookie。但是我偏偏遇到了將maxAge設為0刪不掉cookie的問題。

對於這個問題,我失敗有兩個原因,一個比較有意義,另一個是對Java web常識出錯。我都說一下

原理

比較有意義的一個錯誤是沒有設定需要刪除的cookie的路徑:Java的HttpServletRequest的API(用的Tomcat)在獲取Cookie的時候,只獲取了名字和值,路徑是null(我debug看到的是這樣,原理上只能說cookie的domain、path在伺服器端都是隻寫的,伺服器端不能讀取

,並不知道為何這樣設計),這樣就有一個問題:設定了cookie的存活時間之後,瀏覽器並不知道我們設定的是哪一個cookie的。這時,我們只需要在設定maxAge的時候,多寫一行程式碼,setPath,就可以了。

延伸 (重點部分)

這裡有一個問題,原則上,以及我看其他部落格的說法,同一伺服器上不同路徑下是可以存在同名的Cookie的,但是我自己用Tomcat在(firefox)上測試卻只能看到一個。

後又經搜尋,發現操縱Cookie瀏覽器的行為還有差異,firefox對於不同路徑下同名的Cookie只能看到一個,Edge則是兩個同名Cookie當作不同的分開標識。
本來我以為firefox只能看到一個說明是同名Cookie覆蓋了,但是沒想到debug掐斷點時竟然看到了兩個同名的Cookie,這就意味著如果運用以往的判斷Cookie的方法if(cookie.getName().equal(some_string))

將會有多個Cookie可以通過篩選,而最後究竟是哪個Cookie被選中取得value就不好說了。
這其中,我們需要知道一點的是,通過HttpServletRequest取得的Cookie[]cookies陣列中同名Cookie排在後面的path更短,也就是更靠近根目錄。

這就不好一句話說清楚了,伴隨的問題將會越來越多,還是推薦儘量不要使用同名Cookie。

另一個不足為提的錯誤是沒有將設定過的Cookie加入到Response中,因為伺服器端設定了Cookie,客戶端,也就是瀏覽器是不知道的,所以對Cookie的所有修改都需要呼叫Response的addCookie方法給客戶端響應,“存”回瀏覽器,這樣,瀏覽器才會更改Cookie。