實習工作當中一個問題,
具體環境:jsp, struts2, tomcat6
問題:cookie的有效期限設置問題
正在做一個投票的東西, 但是要求每個主機對每一個投票只能進行一次投票, 盡量避免重復投票(但是這個要求並不是特別嚴格), 所以考慮用cookie實現, 盡量減少服務端的壓力。
當一個主機第一次對這個投票進行投票之後, 提交的時候, 在代碼裡 新建一個cookie, 然後將cookie.setMaxAge設置為30天, 然後response到客戶端, 當客戶端再一次對這個投票活動進行投票的時候, 會附帶著我在上面new 的cookie, 這樣我就可以通過遍歷所有的cookie然後取到我那個cookie, 然後驗證此主機是否投過票。
問題出現了, 我設置的setMaxAge的值是30天, 但是當這個cookie再次回來的時候它的值變成了-1, 大家都知道默認都是-1, 而且這個代表的是一次會話, 跟session一樣, 當會話結束後就會刪除掉。
解決:可能的問題(代碼、浏覽器?、浏覽器cookie設置問題?、)
首先看了下自己寫的代碼, 沒問題。
再次進行debug, 發現還是-1。
有可能是換了火狐浏覽器還是-1。(IE與火狐浏覽器對session的誤解:在下面細說。)
投票完畢之後關閉當前會話, 重新開啟一個會話, 依然能夠接收到我新建的cookie,maxAge也依然是-1。(我的maxAge設值成功, 也起效了)
查看J2EE文檔, 上面寫的很清楚, 我的就是用setMaxAge來進行設置。沒辦法,google一下, 類似問題不多, 但是有一些, 結果都是不了了之。google國外的網站, 也是不多, 但是也有一些, 結果都是一樣沒有答案。
個人猜想: 浏覽器似乎對這個maxAge屬性愛答不理的, 但它可以取到maxAge的值, 然後在浏覽器內部對這個cookie設置過期時間(這個時間就是從maxAge取到的值), 然後當下次發送請求到服務器的時候, 它會把所有的cookie都附帶上(可之前會取得path、domain屬性, 然後判斷是否發送)。 所謂的session在浏覽器允許cookie的情況下, 一般多是采用cookie的形式("JSESSIONID", 唯一標示符)傳送, 所以浏覽器可能把所有的cookie都看成session, 默認賦將maxAge值成-1。
有過同樣經歷的人, 但有跟我不同見解的人希望說說。 (最好哪位大神, 會開發浏覽器的, 還讀過tomcat源碼的人, 給指點下, 謝謝)
IE與火狐浏覽器對session的誤解:
我剛開始學習session的時候, 發現並不是像文檔上說的那樣, 一次會話最通俗的理解就是:一個浏覽器頁面打開以後的當前頁面或者從當前頁面衍生出來的頁面與服務器的會話都是在一個會話范圍內的。 因為IE、火狐、谷歌、 或者opera等其他浏覽器是有些不同的, 有的時候從火狐頁面發起一次會話, 然後關閉當前頁面, 再重新打開一個新的頁面發現, 還是上一個頁面的會話范圍(但是換做IE就不會這樣)。很奇怪(原因: 火狐浏覽器打開的那些頁面其實都在一個進程內的, 所以當然屬於一次會話, 但是如果殺死firefox.exe進程之後再重新打開一次會話, 就是不會出現上面的問題, 現在除了IE, 似乎大部分浏覽器都采用這種方式, 火狐的頁面我們全部關閉之後還會有一個界面, 這些頁面似乎就是這個主界面的子頁面, 所以session都是共享的, 其實應該都是共享主界面的吧?)
摘自 從此愛上蒲肉格蕾銘