我目前正在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指定一些其他屬性?
非常感謝。
感謝您的回答。我還有一個問題:我首先登錄並檢查「記住我」,然後退出前檢索cookie,並在HttpServletResponse中將maxAge設置爲0。然後,我再次登錄時沒有在篩選器中檢查「記住我」,這一次,我仍然可以檢索首次登錄時創建的相同Cookie,但我不知道cookie爲什麼仍然存在。 除此之外,關於cookie名稱,它應該始終是同一個嗎?即使不同的用戶登錄?如果用戶不檢查「記住我」而登錄,是否應該創建一個cookie? – qiuzmjq
顯然你在不同的路徑上有多個cookie。一個常見的入門者的錯誤是,Cookie路徑從未明確設置,因此默認爲URL中當前打開的文件夾。您應該明確地將Cookie路徑設置爲您希望使用此Cookie的所有文件夾的公共父級。如果這是webapp的根文件夾,請設置'「/」'。另見a.o. http://stackoverflow.com/a/28177426 – BalusC
我已將路徑設置爲「/」。我很奇怪第二次登錄過濾器時,Cookie仍然存在,即使我已經在HttpServletResponse中將maxAge設置爲0,以表示首次註銷。 – qiuzmjq