คุณจะลบคุกกี้ใน Java Servlet ได้อย่างไร


135

คุณจะลบคุกกี้ใน servlet Java ได้อย่างไร

ฉันลองสิ่งนี้: http://www.jguru.com/faq/view.jsp?EID=42225

แก้ไข: ตอนนี้ทำงานได้สำเร็จดูเหมือนจะเป็นการรวมกันของ:

response.setContentType("text/html");

และ

cookie.setMaxAge(0);

ก่อนที่ฉันจะทำ:

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

ซึ่งจะหมดอายุคุกกี้เมื่อเบราว์เซอร์จะปิดตามเอกสาร

ค่าติดลบหมายความว่าคุกกี้จะไม่ถูกเก็บไว้อย่างต่อเนื่องและจะถูกลบเมื่อเว็บเบราว์เซอร์ออก ค่าศูนย์ทำให้คุกกี้ถูกลบ

ตัวอย่างข้อมูลการทำงานที่สมบูรณ์เพื่อให้คุกกี้หมดอายุคือ:

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

คำตอบ:


139

MaxAge ของ -1 ส่งสัญญาณว่าคุณต้องการให้คุกกี้คงอยู่ตลอดช่วงเวลาของเซสชัน คุณต้องการตั้งค่า MaxAge เป็น 0 แทน

จากเอกสาร API :

ค่าติดลบหมายความว่าคุกกี้จะไม่ถูกเก็บไว้อย่างต่อเนื่องและจะถูกลบเมื่อเว็บเบราว์เซอร์ออก ค่าศูนย์ทำให้คุกกี้ถูกลบ

9
ฉันลอง setMaxAge (0) ครั้งแรกใน firefox แต่ฉันยังเห็นมันแสดงในคุกกี้ของฉันว่า "Expires: at end of session" และคิดว่า servlet ของฉันยังคงได้รับคุกกี้ที่หมดอายุนั้น อาจเป็นคำสั่งผสมที่จำเป็นต้องตั้ง response.setContentType ("text / html"); และ setMaxAge (0); นั่นทำให้มันใช้งานได้ในที่สุด ฉันลองอีกครั้งและดูเหมือนว่าคุกกี้ที่มี setMaxAge (0) จะไม่ถูกส่งไปตามคำขอในภายหลังไปยัง Java servlets ของฉัน
Dougnukem

62

ในสภาพแวดล้อมของฉันรหัสต่อไปนี้ใช้งานได้ แม้ว่าจะดูซ้ำซ้อนในตอนแรกcookies[i].setValue("");และcookies[i].setPath("/");จำเป็นต้องล้างคุกกี้อย่างถูกต้อง

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
ดูเหมือนว่าจะทำงานอย่างสม่ำเสมอในทุกเบราว์เซอร์
ug_

5
ฉันไม่แน่ใจว่าคุณควรกำหนดค่าหรือเส้นทางของคุกกี้เนื่องจากอาจถูกมองว่าเป็นคุกกี้อื่นใช่ไหม หากต้องการล้างคุกกี้คุณควรกำหนดอายุสูงสุดเป็น 0 เท่านั้น
สีเทา

2
cookie.setPath (... ) ต้องตรงกับเส้นทางที่ใช้เมื่อสร้างคุกกี้ (เหมือนกันสำหรับชื่อคุกกี้และโดเมน)
markus

12

โปรดทราบว่าแท้จริงแล้วคุกกี้กำหนดโดยทูเปิลของชื่อเส้นทางและโดเมน หากหนึ่งในสามส่วนนี้แตกต่างกันหรือมีคุกกี้ที่มีชื่อเดียวกันมากกว่าหนึ่งรายการ แต่กำหนดด้วยเส้นทาง / โดเมนที่อาจยังมองเห็นได้สำหรับ URL ที่เป็นปัญหาคุณจะยังคงเห็นคุกกี้นั้นส่งมาตามคำขอ เช่นถ้า URL คือ " http://foo.bar.com/baz/index.html " คุณจะเห็นคุกกี้ใด ๆ ที่กำหนดบน bar.com หรือ foo.bar.com หรือมีเส้นทาง "/" หรือ "/ baz".

ดังนั้นสิ่งที่คุณดูเหมือนว่าควรใช้งานได้ตราบใดที่มีคุกกี้เพียงรายการเดียวที่กำหนดไว้ในไคลเอนต์โดยมีชื่อ "SSO_COOKIE_NAME" โดเมน "SSO_DOMAIN" และเส้นทาง "/" หากมีคุกกี้ที่มีเส้นทางหรือโดเมนที่แตกต่างกันคุณจะยังคงเห็นคุกกี้ที่ส่งไปยังไคลเอนต์

หากต้องการแก้ไขข้อบกพร่องนี้ให้ไปที่การตั้งค่าของ Firefox -> แท็บความปลอดภัยและค้นหาคุกกี้ทั้งหมดด้วย SSO_COOKIE_NAME คลิกที่แต่ละรายการเพื่อดูโดเมนและเส้นทาง ฉันพนันได้เลยว่าคุณจะพบหนึ่งในนั้นซึ่งไม่ใช่สิ่งที่คุณคาดหวัง


ในขณะที่อาจเป็นไปได้ว่าชื่อหรือเส้นทางไม่ใช่ของคุกกี้ที่เขากำลังดูอยู่ในเบราว์เซอร์ (เมื่อเขาแก้ไขค่า MaxAge) การมีหรือไม่มีคุกกี้อื่น ๆ จะไม่เกี่ยวข้องกับสถานะการมีหรือไม่มี คุกกี้ที่เขาตั้งไว้
cjs

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

มันไม่ได้ผล? การดำเนินการนี้จะลบคุกกี้ทั้งหมดหากมีการตอบกลับ


15
อย่าลืมเพิ่มคุกกี้ที่เปลี่ยนแปลงกลับไปในการตอบกลับด้วย response.addCookie (คุกกี้ [i]);
Philihp Busby

7

นี่คือรหัสที่ฉันเคยใช้มาก่อนอย่างมีประสิทธิภาพโดยส่งผ่าน"/"เป็นพารามิเตอร์ strPath

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

    return cookie;
}

0

กรณีพิเศษอย่างหนึ่ง: คุกกี้ไม่มีเส้นทาง

ในกรณีนี้กำหนดเส้นทางเป็น cookie.setPath(request.getRequestURI())

จาวาสคริปต์จะตั้งค่าคุกกี้โดยไม่มีเส้นทางเพื่อให้เบราว์เซอร์แสดงเป็นคุกกี้สำหรับหน้าปัจจุบันเท่านั้น ถ้าผมพยายามที่จะส่งคุกกี้ที่หมดอายุด้วยpath == /แสดงให้เห็นว่าเบราว์เซอร์ทั้งสองคุกกี้หนึ่งหมดอายุด้วยและอีกคนหนึ่งด้วยpath == /path == current page


0

วิธีที่เหมาะสมในการลบคุกกี้คือการตั้งค่าอายุสูงสุดเป็น 0 และเพิ่มคุกกี้กลับไปที่วัตถุ HttpServletResponse

คนส่วนใหญ่ไม่ทราบหรือลืมที่จะเพิ่มคุกกี้กลับเข้าไปในวัตถุตอบกลับ โดยการทำเช่นนั้นจะหมดอายุและนำคุกกี้ออกทันที

...retrieve cookie from HttpServletRequest
cookie.setMaxAge(0);
response.addCookie(cookie);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.