天天看點

關于設定了setMaxAge(0)而浏覽器未成功删除Cookie的注意事項

最近做了個系統,其中涉及到對Cookie的操作。當使用者登入時,設定一些資料到Cookie中,使用者登出系統的時候删除寫入浏覽器中的對應Cookie。

問題就出在登出系統時,在firebug中看到需要删除的Cookie并沒有删除掉。

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

直接上代碼:

登入時寫Cookie:

Java代碼 

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); 

    } 

關于設定了setMaxAge(0)而浏覽器未成功删除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);  

    }  

關于設定了setMaxAge(0)而浏覽器未成功删除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); 

               } 

           } 

       } 

   } 

關于設定了setMaxAge(0)而浏覽器未成功删除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);  

               }  

           }  

       }  

   }  

關于設定了setMaxAge(0)而浏覽器未成功删除Cookie的注意事項