Bagaimana Anda menghapus Cookie di Java Servlet

135

Bagaimana Anda menghapus cookie di servlet Java?

Saya mencoba ini: http://www.jguru.com/faq/view.jsp?EID=42225

EDIT: Yang berikut ini sekarang berfungsi dengan baik tampaknya merupakan kombinasi dari:

response.setContentType("text/html");

dan

cookie.setMaxAge(0);

Sebelum saya melakukan:

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

Cookie mana yang kedaluwarsa ketika browser ditutup sesuai dengan dokumentasi .

Nilai negatif berarti cookie tidak disimpan terus-menerus dan akan dihapus ketika browser Web keluar. Nilai nol menyebabkan cookie dihapus.

Cuplikan yang berfungsi penuh untuk kedaluwarsa cookie adalah:

//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);
Dougnukem
sumber

Jawaban:

138

MaxAge dari -1 memberi sinyal bahwa Anda ingin cookie tetap ada selama sesi berlangsung. Anda ingin mengatur MaxAge menjadi 0 sebagai gantinya.

Dari dokumentasi API :

Nilai negatif berarti cookie tidak disimpan terus-menerus dan akan dihapus ketika browser Web keluar. Nilai nol menyebabkan cookie dihapus.
cjs
sumber
9
Saya mencoba setMaxAge (0) pada awalnya di firefox tapi saya masih melihatnya terdaftar di cookie saya sebagai "Kedaluwarsa: di akhir sesi" dan saya pikir servlet saya masih menerima cookie yang kadaluwarsa itu. Mungkin merupakan kombinasi dari keharusan untuk mengatur response.setContentType ("text / html"); dan setMaxAge (0); yang akhirnya membuatnya bekerja. Saya mencobanya lagi dan tampaknya cookie dengan setMaxAge (0) tidak akan dikirim dalam permintaan berikutnya ke servlets Java saya.
Dougnukem
62

Di lingkungan saya, kode berikut berfungsi. Meskipun terlihat berlebihan pada pandangan pertama, cookies[i].setValue("");dan cookies[i].setPath("/");perlu untuk menghapus cookie dengan benar.

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);
        }
}
wu liang
sumber
1
Ini tampaknya bekerja secara konsisten di semua browser.
ug_
5
Saya tidak yakin Anda harus menetapkan nilai atau jalur cookie karena itu mungkin dilihat sebagai cookie yang berbeda, bukan? Untuk menghapus cookie, Anda hanya perlu mengatur usia maks menjadi 0.
Gray
2
cookie.setPath (...) harus cocok dengan jalur apa pun yang digunakan ketika cookie dibuat (sama untuk nama dan domain cookie).
markus
12

Perlu diingat bahwa cookie sebenarnya ditentukan oleh tuple dari nama, jalur, dan domainnya. Jika salah satu dari ketiganya berbeda, atau ada lebih dari satu cookie dengan nama yang sama, tetapi didefinisikan dengan jalur / domain yang mungkin masih terlihat untuk URL yang dipermasalahkan, Anda masih akan melihat cookie itu melewati permintaan. Misalnya, jika urlnya adalah " http://foo.bar.com/baz/index.html ", Anda akan melihat cookie apa pun yang didefinisikan di bar.com atau foo.bar.com, atau dengan lintasan "/" atau "/ baz".

Dengan demikian, apa yang Anda miliki tampaknya berfungsi, asalkan hanya ada satu cookie yang ditentukan dalam klien, dengan nama "SSO_COOKIE_NAME", domain "SSO_DOMAIN", dan path "/". Jika ada cookie dengan jalur atau domain berbeda, Anda masih akan melihat cookie yang dikirim ke klien.

Untuk men-debug ini, buka preferensi Firefox -> tab Keamanan, dan cari semua cookie dengan SSO_COOKIE_NAME. Klik masing-masing untuk melihat domain dan jalur. Saya yakin Anda akan menemukan satu di sana yang tidak sesuai harapan Anda.

broofa
sumber
Meskipun bisa juga nama atau jalurnya bukan dari cookie yang dia lihat di browser (begitu dia memperbaiki nilai MaxAge), ada atau tidaknya cookie lain tidak ada hubungannya dengan keadaan, ada atau tidak adanya cookie tertentu yang dia atur.
cjs
8
Cookie[] cookies = request.getCookies();
if(cookies!=null)
for (int i = 0; i < cookies.length; i++) {
 cookies[i].setMaxAge(0);
}

apakah itu tidak berhasil? Ini menghapus semua cookie jika respons dikirim kembali.

aholbreich
sumber
15
Jangan lupa untuk menambahkan cookie yang diubah kembali ke respons dengan response.addCookie (cookies [i]);
Philihp Busby
7

Ini adalah kode yang telah saya gunakan secara efektif sebelumnya, lulus "/"sebagai parameter strPath.

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

    return cookie;
}
Kevin Hakanson
sumber
0

Satu kasus khusus: cookie tidak memiliki jalur.

Dalam hal ini tetapkan path sebagai cookie.setPath(request.getRequestURI())

Javascript menetapkan cookie tanpa path sehingga browser menunjukkannya sebagai cookie untuk halaman saat ini saja. Jika saya mencoba mengirim cookie yang kadaluwarsa dengan path == /browser menunjukkan dua cookie: yang satu kadaluwarsa dengan yang path == /lain dengan path == current page.

UR6LAD
sumber