Làm cách nào để xóa Cookie trong Servlet Java


135

Làm thế nào để bạn loại bỏ một cookie trong một servlet Java?

Tôi đã thử điều này: http://www.jguru.com/faq/view.jsp?EID=42225

EDIT: Sau đây hoạt động thành công, nó dường như là sự kết hợp của:

response.setContentType("text/html");

cookie.setMaxAge(0);

Trước khi tôi làm:

//remove single signon cookie if it hasn't been validated yet
response.setContentType("text/html");
Cookie cookie = new Cookie(SSORealm.SSO_COOKIE_NAME, "");
cookie.setDomain(SSORealm.SSO_DOMAIN);
cookie.setMaxAge(-1);
cookie.setPath("/");
cookie.setComment("EXPIRING COOKIE at " + System.currentTimeMillis());
response.addCookie(cookie);

Mà hết hạn cookie khi đóng trình duyệt theo tài liệu .

Giá trị âm có nghĩa là cookie không được lưu trữ liên tục và sẽ bị xóa khi trình duyệt Web thoát. Giá trị bằng 0 khiến cookie bị xóa.

Đoạn mã làm việc đầy đủ để hết hạn cookie là:

//remove single signon cookie if it hasn't been validated yet
response.setContentType("text/html");
Cookie cookie = new Cookie(SSORealm.SSO_COOKIE_NAME, "");
cookie.setDomain(SSORealm.SSO_DOMAIN);
cookie.setMaxAge(0);
cookie.setPath("/");
cookie.setComment("EXPIRING COOKIE at " + System.currentTimeMillis());
response.addCookie(cookie);

Câu trả lời:


137

MaxAge of -1 báo hiệu rằng bạn muốn cookie tồn tại trong suốt thời gian của phiên. Bạn muốn đặt MaxAge thành 0 thay thế.

Từ tài liệu API :

Giá trị âm có nghĩa là cookie không được lưu trữ liên tục và sẽ bị xóa khi trình duyệt Web thoát. Giá trị bằng 0 khiến cookie bị xóa.

9
Tôi đã thử setMaxAge (0) ban đầu trong firefox nhưng tôi vẫn thấy nó được liệt kê trong cookie của mình là "Hết hạn: vào cuối phiên" và nghĩ rằng servlet của tôi vẫn nhận được cookie đã hết hạn. Nó có thể là một kết hợp cần thiết để đặt answer.setContentType ("text / html"); và setMaxAge (0); Điều đó làm cho nó cuối cùng hoạt động. Tôi đã thử lại và có vẻ như cookie với setMaxAge (0) sẽ không được gửi trong các yêu cầu tiếp theo tới các máy chủ Java của tôi.
Dougnukem

62

Trong môi trường của tôi, mã sau hoạt động. Mặc dù thoạt nhìn có vẻ dư thừa cookies[i].setValue("");cookies[i].setPath("/");cần thiết để xóa cookie đúng cách.

private void eraseCookie(HttpServletRequest req, HttpServletResponse resp) {
    Cookie[] cookies = req.getCookies();
    if (cookies != null)
        for (Cookie cookie : cookies) {
            cookie.setValue("");
            cookie.setPath("/");
            cookie.setMaxAge(0);
            resp.addCookie(cookie);
        }
}

1
Điều này dường như hoạt động nhất quán trên tất cả các trình duyệt.
ug_

5
Tôi không chắc bạn nên đặt giá trị hoặc đường dẫn của cookie bởi vì đó có thể được xem là một cookie khác, phải không? Để xóa cookie, bạn chỉ nên đặt tuổi tối đa là 0.
Xám

2
cookie.setPath (...) cần khớp với bất kỳ đường dẫn nào đã được sử dụng khi cookie được tạo (giống với tên cookie và tên miền).
markus

12

Hãy nhớ rằng một cookie thực sự được xác định bởi bộ tên, đường dẫn và tên miền của nó. Nếu bất kỳ một trong ba điều này là khác nhau, hoặc có nhiều hơn một cookie cùng tên, nhưng được xác định bằng các đường dẫn / tên miền vẫn có thể hiển thị cho URL được đề cập, bạn vẫn sẽ thấy cookie đó được chuyển theo yêu cầu. Ví dụ: nếu url là " http://foo.bar.com/baz/index.html ", bạn sẽ thấy bất kỳ cookie nào được xác định trên bar.com hoặc foo.bar.com hoặc với đường dẫn "/" hoặc "/ baz".

Do đó, những gì bạn trông giống như nó sẽ hoạt động, miễn là chỉ có một cookie được xác định trong ứng dụng khách, với tên "SSO_COOKIE_NAME", tên miền "SSO_DOMAIN" và đường dẫn "/". Nếu có bất kỳ cookie nào có đường dẫn hoặc tên miền khác nhau, bạn vẫn sẽ thấy cookie được gửi cho khách hàng.

Để gỡ lỗi này, hãy truy cập vào tùy chọn của Firefox -> tab Bảo mật và tìm kiếm tất cả các cookie có SSO_COOKIE_NAME. Click vào từng cái để xem tên miền và đường dẫn. Tôi cá là bạn sẽ tìm thấy một thứ trong đó không hoàn toàn như bạn mong đợi.


Mặc dù cũng có thể tên hoặc đường dẫn không phải là cookie mà anh ta đang xem trong trình duyệt (một khi anh ta sửa giá trị MaxAge), sự hiện diện hay vắng mặt của các cookie khác không liên quan gì đến trạng thái, sự hiện diện hay vắng mặt của cookie cụ thể anh ấy đang thiết lập.
cjs

8
Cookie[] cookies = request.getCookies();
if(cookies!=null)
for (int i = 0; i < cookies.length; i++) {
 cookies[i].setMaxAge(0);
}

đã không làm việc? Điều này loại bỏ tất cả các cookie nếu phản hồi được gửi lại.


15
Đừng quên thêm cookie đã thay đổi trở lại phản hồi bằng answer.addCookie (cookies [i]);
Philihp Busby

7

Đây là mã mà tôi đã sử dụng hiệu quả trước đây, chuyển qua "/"làm tham số strPath.

public static Cookie eraseCookie(String strCookieName, String strPath) {
    Cookie cookie = new Cookie(strCookieName, "");
    cookie.setMaxAge(0);
    cookie.setPath(strPath);

    return cookie;
}

0

Một trường hợp đặc biệt: một cookie không có đường dẫn.

Trong trường hợp này, đặt đường dẫn là cookie.setPath(request.getRequestURI())

Javascript đặt cookie mà không có đường dẫn để trình duyệt chỉ hiển thị dưới dạng cookie cho trang hiện tại. Nếu tôi cố gắng gửi cookie hết hạn với path == /trình duyệt sẽ hiển thị hai cookie: một đã hết hạn path == /và một khác với path == current page.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.