最近做了個系統,其中涉及到對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);
}

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