2016-03-27 63 views
0

我目前正在JSF中實現「自動登錄」機制。實現過濾器來攔截每個請求,並通過讀取cookie來檢查用戶是否已登錄。Cookie maxAge總是-1

當用戶第一次登錄,在管理bean時,cookie保存在這樣:

HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
Cookie cookie = new Cookie("myCookieRef", value); 
cookie.setPath("/"); 
cookie.setMaxAge(3600); 
response.addCookie(cookie); 

以後如果用戶進行重定向,在過濾器中,我用下面的代碼來檢索cookie:

Cookie[] cookies = request.getCookies(); 
if (cookies != null) 
{ 
    for (Cookie cookie : cookies) 
    { 
     if (name.equals("myCookieRef")) 
     { 
      return cookie; 
     } 
    } 
} 

請求是HttpServletRequest對象。

的問題是返回的餅乾總是有一個-1MAXAGE

我不知道在添加cookie時是否錯過任何內容,或者我應該爲Cookie指定一些其他屬性?

非常感謝。

回答

2

客戶端不會將名稱和值以外的cookie屬性發送回服務器。

另請參閱RFC6265 section 4.2.2(強調我的)。

4.2.2。語義

每個cookie對錶示由用戶代理存儲的cookie。 Cookie對包含用戶代理 在Set-Cookie標頭中收到的cookie名稱和cookie值。

請注意,cookie屬性不會返回。特別是, 服務器無法單獨確定cookie標頭何時會過期,cookie的有效期限爲哪個主機,其中的 路徑Cookie是否有效,或者cookie是否使用安全或HttpOnly屬性設置爲 。

最大年齡表現爲指定。而且,如果它已經在客戶端過期,那麼整個cookie將不會從客戶端發送到服務器。在服務器端,通常只需通過設置具有相同名稱/值的新cookie來延長cookie在每次「自動登錄」時的生存期,並在沒有登錄用戶的情況下檢查請求(如果存在或不存在cookie),而不是過期與否。

如果由於其他原因,最大年齡值對您來說真的很重要,請將其存儲在某個數據庫的您身邊以及唯一的cookie標識符(cookie值)。

至於null值,這表明您的代碼中存在問題,而不是在Cookie中。這個問題在目前所提供的信息中是不可見的,但我確定如果你再次檢查/調試它,你會發現一個簡單的錯誤。

至於「自動登錄」的具體功能要求,這可能是一個有用的閱讀:How to implement "Stay Logged In" when user login in to the web application

+0

感謝您的回答。我還有一個問題:我首先登錄並檢查「記住我」,然後退出前檢索cookie,並在HttpServletResponse中將maxAge設置爲0。然後,我再次登錄時沒有在篩選器中檢查「記住我」,這一次,我仍然可以檢索首次登錄時創建的相同Cookie,但我不知道cookie爲什麼仍然存在。 除此之外,關於cookie名稱,它應該始終是同一個嗎?即使不同的用戶登錄?如果用戶不檢查「記住我」而登錄,是否應該創建一個cookie? – qiuzmjq

+0

顯然你在不同的路徑上有多個cookie。一個常見的入門者的錯誤是,Cookie路徑從未明確設置,因此默認爲URL中當前打開的文件夾。您應該明確地將Cookie路徑設置爲您希望使用此Cookie的所有文件夾的公共父級。如果這是webapp的根文件夾,請設置'「/」'。另見a.o. http://stackoverflow.com/a/28177426 – BalusC

+0

我已將路徑設置爲「/」。我很奇怪第二次登錄過濾器時,Cookie仍然存在,即使我已經在HttpServletResponse中將maxAge設置爲0,以表示首次註銷。 – qiuzmjq