最近做了個系統,其中涉及到對Cookie的操作。當用戶登錄時,設置一些數據到Cookie中,用戶登出系統的時候刪除寫入瀏覽器中的對應Cookie。
問題就出在登出系統時,在firebug中看到需要刪除的Cookie並沒有刪除掉。
最后經過自己的debug,終於找到了問題的所在。
直接上代碼:
登錄時寫Cookie:
- public void setLoginIDCookie1(HttpServletResponse response, String value) {
- Cookie cookie = new Cookie(loginIdCookieKey, value);
- // 設置cookie的域,如果不設置該屬性將不能夠寫入cookie
- if (!StringUtils.isBlank(domain)) {
- cookie.setDomain(domain);
- }
- // 設置cookie的路徑,這個路徑即改工程下都可以訪問該cookie 如果不設置路徑,那么只有設置該cookie的路徑及其子路徑可以訪問
- if (!StringUtils.isBlank(path)) {
- cookie.setPath(path);
- }
- // 設置cookie的過期時間(單位秒)
- if (expiry > 0) {
- cookie.setMaxAge(expiry);
- }
- response.addCookie(cookie);
- }
- public void setLoginIDCookie1(HttpServletResponse response, String value) {
- Cookie cookie = new Cookie(loginIdCookieKey, value);
- // 設置cookie的域,如果不設置該屬性將不能夠寫入cookie
- if (!StringUtils.isBlank(domain)) {
- cookie.setDomain(domain);
- }
- // 設置cookie的路徑,這個路徑即改工程下都可以訪問該cookie 如果不設置路徑,那么只有設置該cookie的路徑及其子路徑可以訪問
- if (!StringUtils.isBlank(path)) {
- cookie.setPath(path);
- }
- // 設置cookie的過期時間(單位秒)
- if (expiry > 0) {
- cookie.setMaxAge(expiry);
- }
- response.addCookie(cookie);
- }
登出時,刪除Cookie:
- public void deleteLoginCookies(HttpServletRequest request, HttpServletResponse response) {
- Cookie[] cookies = request.getCookies();
- if (cookies != null && cookies.length >0) {
- // 遍歷瀏覽器發送到服務器端的所有Cookie,找到自己設置的Cookie
- for (Cookie cookie : cookies) {
- String cookieName = cookie.getName();
- if (cookieName.equals(loginIdCookieKey)) {
- // 設置Cookie立即失效
- cookie.setMaxAge(0);
- /**
- * 刪除Cookie時,只設置maxAge=0將不能夠從瀏覽器中刪除cookie,
- * 因為一個Cookie應當屬於一個path與domain,所以刪除時,Cookie的這兩個屬性也必須設置。
- *
- * 誤區:剛開始時,我沒有發現客戶端發送到服務器端的cookie的path與domain值為空這個問題。
- * 因為在登陸系統時,我設置了Cookie的path與domain屬性的值,就誤認為每次客戶端請求時,都會把Cookie的
- * 這兩個屬性也提交到服務器端,但系統並沒有把path與domain提交到服務器端(提交過來的只有Cookie的key,value值)。
- */
- // 重點是這里1,必須設置domain屬性的值
- cookie.setDomain(domain);
- // 重點是這里2,必須設置path屬性的值
- cookie.setPath(path);
- response.addCookie(cookie);
- }
- }
- }
- }
- public void deleteLoginCookies(HttpServletRequest request, HttpServletResponse response) {
- Cookie[] cookies = request.getCookies();
- if (cookies != null && cookies.length > 0) {
- // 遍歷瀏覽器發送到服務器端的所有Cookie,找到自己設置的Cookie
- for (Cookie cookie : cookies) {
- String cookieName = cookie.getName();
- if (cookieName.equals(loginIdCookieKey)) {
- // 設置Cookie立即失效
- cookie.setMaxAge(0);
- /**
- * 刪除Cookie時,只設置maxAge=0將不能夠從瀏覽器中刪除cookie,
- * 因為一個Cookie應當屬於一個path與domain,所以刪除時,Cookie的這兩個屬性也必須設置。
- *
- * 誤區:剛開始時,我沒有發現客戶端發送到服務器端的cookie的path與domain值為空這個問題。
- * 因為在登陸系統時,我設置了Cookie的path與domain屬性的值,就誤認為每次客戶端請求時,都會把Cookie的
- * 這兩個屬性也提交到服務器端,但系統並沒有把path與domain提交到服務器端(提交過來的只有Cookie的key,value值)。
- */
- // 重點是這里1,必須設置domain屬性的值
- cookie.setDomain(domain);
- // 重點是這里2,必須設置path屬性的值
- cookie.setPath(path);
- response.addCookie(cookie);
- }
- }
- }
- }