關於設置了setMaxAge(0)而瀏覽器未成功刪除Cookie的注意事項


最近做了個系統,其中涉及到對Cookie的操作。當用戶登錄時,設置一些數據到Cookie中,用戶登出系統的時候刪除寫入瀏覽器中的對應Cookie。
問題就出在登出系統時,在firebug中看到需要刪除的Cookie並沒有刪除掉。

最后經過自己的debug,終於找到了問題的所在。

直接上代碼:


登錄時寫Cookie:

Java代碼 
  1. public void setLoginIDCookie1(HttpServletResponse response, String value) { 
  2.         Cookie cookie = new Cookie(loginIdCookieKey, value); 
  3.         // 設置cookie的域,如果不設置該屬性將不能夠寫入cookie 
  4.         if (!StringUtils.isBlank(domain)) { 
  5.             cookie.setDomain(domain); 
  6.         } 
  7.         // 設置cookie的路徑,這個路徑即改工程下都可以訪問該cookie 如果不設置路徑,那么只有設置該cookie的路徑及其子路徑可以訪問 
  8.         if (!StringUtils.isBlank(path)) { 
  9.             cookie.setPath(path); 
  10.         } 
  11.         // 設置cookie的過期時間(單位秒) 
  12.         if (expiry > 0) { 
  13.             cookie.setMaxAge(expiry); 
  14.         } 
  15.         response.addCookie(cookie); 
  16.     } 
[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public void setLoginIDCookie1(HttpServletResponse response, String value) {  
  2.         Cookie cookie = new Cookie(loginIdCookieKey, value);  
  3.         // 設置cookie的域,如果不設置該屬性將不能夠寫入cookie  
  4.         if (!StringUtils.isBlank(domain)) {  
  5.             cookie.setDomain(domain);  
  6.         }  
  7.         // 設置cookie的路徑,這個路徑即改工程下都可以訪問該cookie 如果不設置路徑,那么只有設置該cookie的路徑及其子路徑可以訪問  
  8.         if (!StringUtils.isBlank(path)) {  
  9.             cookie.setPath(path);  
  10.         }  
  11.         // 設置cookie的過期時間(單位秒)  
  12.         if (expiry > 0) {  
  13.             cookie.setMaxAge(expiry);  
  14.         }  
  15.         response.addCookie(cookie);  
  16.     }  





登出時,刪除Cookie:

Java代碼 
  1. public void deleteLoginCookies(HttpServletRequest request, HttpServletResponse response) { 
  2.        Cookie[] cookies = request.getCookies(); 
  3.        if (cookies != null && cookies.length >0) { 
  4.            // 遍歷瀏覽器發送到服務器端的所有Cookie,找到自己設置的Cookie 
  5.            for (Cookie cookie : cookies) { 
  6.                String cookieName = cookie.getName(); 
  7.                if (cookieName.equals(loginIdCookieKey)) { 
  8.                    // 設置Cookie立即失效 
  9.                    cookie.setMaxAge(0); 
  10.                    /**
  11.                     * 刪除Cookie時,只設置maxAge=0將不能夠從瀏覽器中刪除cookie,
  12.                     * 因為一個Cookie應當屬於一個path與domain,所以刪除時,Cookie的這兩個屬性也必須設置。
  13.                     *
  14.                     * 誤區:剛開始時,我沒有發現客戶端發送到服務器端的cookie的path與domain值為空這個問題。
  15.                     * 因為在登陸系統時,我設置了Cookie的path與domain屬性的值,就誤認為每次客戶端請求時,都會把Cookie的
  16.                     * 這兩個屬性也提交到服務器端,但系統並沒有把path與domain提交到服務器端(提交過來的只有Cookie的key,value值)。
  17.                     */ 
  18.                    // 重點是這里1,必須設置domain屬性的值 
  19.                    cookie.setDomain(domain); 
  20.                    // 重點是這里2,必須設置path屬性的值 
  21.                    cookie.setPath(path); 
  22.                    response.addCookie(cookie); 
  23.                } 
  24.            } 
  25.        } 
  26.    } 
[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public void deleteLoginCookies(HttpServletRequest request, HttpServletResponse response) {  
  2.        Cookie[] cookies = request.getCookies();  
  3.        if (cookies != null && cookies.length > 0) {  
  4.            // 遍歷瀏覽器發送到服務器端的所有Cookie,找到自己設置的Cookie  
  5.            for (Cookie cookie : cookies) {  
  6.                String cookieName = cookie.getName();  
  7.                if (cookieName.equals(loginIdCookieKey)) {  
  8.                    // 設置Cookie立即失效  
  9.                    cookie.setMaxAge(0);  
  10.                    /** 
  11.                     * 刪除Cookie時,只設置maxAge=0將不能夠從瀏覽器中刪除cookie, 
  12.                     * 因為一個Cookie應當屬於一個path與domain,所以刪除時,Cookie的這兩個屬性也必須設置。 
  13.                     *  
  14.                     * 誤區:剛開始時,我沒有發現客戶端發送到服務器端的cookie的path與domain值為空這個問題。 
  15.                     * 因為在登陸系統時,我設置了Cookie的path與domain屬性的值,就誤認為每次客戶端請求時,都會把Cookie的 
  16.                     * 這兩個屬性也提交到服務器端,但系統並沒有把path與domain提交到服務器端(提交過來的只有Cookie的key,value值)。 
  17.                     */  
  18.                    // 重點是這里1,必須設置domain屬性的值  
  19.                    cookie.setDomain(domain);  
  20.                    // 重點是這里2,必須設置path屬性的值  
  21.                    cookie.setPath(path);  
  22.                    response.addCookie(cookie);  
  23.                }  
  24.            }  
  25.        }  
  26.    }  



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM