2012-02-18 369 views
0

我有一個Web應用程序運行在舊的已修改Tomcat安裝上。爲了刪除註銷後會話cookie,我有以下代碼:Java Cookie.setMaxAge(0)的行爲是否落實到實施或者是否有規範?

Cookie sessionCookie = new Cookie("session",null); 
sessionCookie.setMaxAge(0); 
response.addCookie(sessionCookie); 

在我的web應用程序,我有一個問題,即隨着到期cookie的部分它返回當前時間:

Set-Cookie: sesssion=null; Expires=Sat, 18-Feb-2012 18:04:52 GMT 

問題是隻需要一個客戶端的PC稍微在服務器後面進行發送cookie!

然而,在Tomcat 5.5中,它返回:

Set-Cookie: session=null; Expires=Thu, 01-Jan-1970 00:00:10 GMT 

哪個是更期望的行爲。

我的問題是都是正確的,是有關於這個應該怎麼實現的任何官方指南,文件只是規定:

零值會導致刪除cookie。

也許我必須自己添加Set-Cookie:頭以解決此問題?

回答

0

如果到期時間< =當前時間,瀏覽器將過期cookie。

如果你手動完成,大多數人會返回0紀元(這是你看到的與tomcat 5.5),或者至少在當前時間減去一些時間來考慮時鐘漂移。話雖如此,你永遠不能說明最終用戶的計算機時鐘已完全被佔用。

即使tomcat 5.5是舊的軟件。今年9月(2012年)是EOL。這聽起來像是你的問題在於你正在運行一個尚未升級或維護的古老版本的tomcat(或java)。偶爾你不得不升級的東西。

1

在規範中似乎沒有任何關於該方法實現的非常具體的內容。

但是,你永遠不應該依賴瀏覽器立即刪除cookies,你甚至不應該依靠瀏覽器刪除cookie,因爲從服務器你根本無法控制客戶端行爲。

你在那個cookie中存儲什麼,你可以簡單地使用已經由容器管理的會話嗎?

當您在服務器上使會話失效時,即使Cookie停留在瀏覽器上也不重要,因爲它會使服務器端無效,並且Cookie中的會話ID不再與現有會話匹配,必然會破壞那屆會議。

+0

這很複雜。這是一個專有的服務器,它已經覆蓋了大部分的servlet部分,你根本不能使會話無效,調用這些方法會導致錯誤。該Cookie是會話ID和負載均衡器的令牌。就目前而言,如果客戶端的時鐘錯誤,負載平衡器會拒絕該請求,因爲「null」格式不正確。但是,如果我允許它傳遞原始會話/令牌,那麼該會話現在已被標記爲已註銷,並且不能用於安全性,因此,使用錯誤時鐘的用戶必須重新啓動瀏覽器! – Alan 2012-02-18 18:57:14

+0

@Alan:瀏覽器不應該被重定向到登錄頁面嗎? – 2012-02-18 21:59:58

+0

@SkipHead它將仍然使用舊的會話ID,因爲服務器允許我們無法使無效和創建一個新的會話,服務器生成新的會話ID的唯一方法是,如果沒有會話在Cookie中傳遞 - I繼承了這一點,絕不會將服務器軟件用於任何其他項目。 – Alan 2012-02-18 22:04:26