2009-05-21 4 views
117

में कुकी को कैसे हटाएं आप जावा सर्वलेट में कुकी कैसे हटाते हैं?जावा सर्लेट

मैंने कोशिश की यह: 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); 

जब ब्राउज़र the documentation के अनुसार बंद होता है तो कुकी समाप्त हो जाती है।

एक ऋणात्मक मान का अर्थ है कि कुकी लगातार संग्रहित नहीं होती है और जब वेब ब्राउज़र निकलता है तो हटा दिया जाएगा। शून्य मान कुकी को हटाए जाने का कारण बनता है।

पूर्ण काम कर रहे टुकड़ा एक कुकी समाप्त होने को है:

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

उत्तर

117

मैक्सएज -1 सिग्नल जो आप चाहते हैं कि कुकी सत्र की अवधि के लिए बने रहें। आप MaxAge को इसके बजाय 0 पर सेट करना चाहते हैं।

API documentation से:

नकारात्मक मान का मतलब है कि कुकी लगातार संग्रहीत नहीं है और जब वेब ब्राउज़र से निकल जाता हटा दिया जाएगा। शून्य मान कुकी को हटाए जाने का कारण बनता है।
+8

मैंने शुरुआत में फ़ायरफ़ॉक्स में setMaxAge (0) को आजमाया लेकिन मैंने अभी भी अपनी कुकीज़ में "समाप्ति: सत्र के अंत में" के रूप में सूचीबद्ध किया और सोचा कि मेरा सर्वलेट अभी भी समाप्त हो चुकी कुकी प्राप्त कर रहा था। यह प्रतिक्रिया.सेटकंटेंट टाइप ("टेक्स्ट/एचटीएमएल") सेट करने की आवश्यकता के कॉम्बो हो सकता है; और सेटमैक्सएज (0); जिसने इसे अंत में काम किया। मैंने इसे फिर से प्रयास किया और ऐसा लगता है कि setMaxAge (0) वाली कुकी को मेरे जावा सर्वलेट के बाद के अनुरोधों में नहीं भेजा जाएगा। – Dougnukem

+0

स्पष्ट और सहायक उत्तर, धन्यवाद। –

11

ध्यान रखें कि एक कुकी वास्तव में यह के नाम, पथ, और डोमेन की टपल द्वारा परिभाषित किया गया है। यदि उनमें से कोई भी तीन अलग है, या एक ही नाम की एक से अधिक कुकी है, लेकिन पथ/डोमेन के साथ परिभाषित किया गया है जो अभी भी यूआरएल के लिए दृश्यमान हो सकता है, तो आप अभी भी उस कुकी को अनुरोध पर पारित कर पाएंगे। जैसे यदि यूआरएल "http://foo.bar.com/baz/index.html" है, तो आपको bar.com या foo.bar.com पर परिभाषित कोई भी कुकी दिखाई देगी, या "/" या "/ baz" के पथ के साथ।

इस प्रकार, आपको ऐसा लगता है कि क्लाइंट में परिभाषित केवल एक कुकी है, जिसका नाम "SSO_COOKIE_NAME", डोमेन "SSO_DOMAIN" और पथ "/" है। यदि अलग-अलग पथ या डोमेन के साथ कोई कुकीज है, तो भी आप क्लाइंट को भेजी गई कुकी देखेंगे।

इसे डीबग करने के लिए, फ़ायरफ़ॉक्स की प्राथमिकताओं में जाएं -> सुरक्षा टैब, और SSO_COOKIE_NAME के ​​साथ सभी कुकीज़ की खोज करें। डोमेन और पथ देखने के लिए प्रत्येक पर क्लिक करें। मैं शर्त लगा रहा हूं कि आपको वहां एक ऐसा मिलेगा जो आप अपेक्षा नहीं कर रहे हैं।

+0

यह भी हो सकता है जबकि उस नाम या पथ कुकी वह ब्राउज़र में को देख रहा है (एक बार वह MaxAge मूल्य ठीक करता है) की है कि नहीं है, उपस्थिति या अन्य कुकीज़ के अभाव के साथ कोई संबंध नहीं है राज्य की उपस्थिति या उपस्थिति की विशेष कुकी की अनुपस्थिति। –

6

यह कोड है जिसे मैंने "/" को strPath पैरामीटर के रूप में पास करने से पहले प्रभावी रूप से उपयोग किया है।

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

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

था कि काम नहीं किया? अगर प्रतिक्रिया वापस भेज दी जाती है तो यह सभी कुकीज़ को हटा देता है।

+11

बदली हुई कुकी को प्रतिक्रिया के साथ प्रतिक्रिया में वापस जोड़ने के लिए मत भूलना .addCookie (कुकीज़ [i]); –

50

मेरे पर्यावरण में, कोड के बाद काम करता है। हालांकि पहली नज़र में अनावश्यक दिखता है, 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

यह सभी ब्राउज़रों में लगातार काम करता प्रतीत होता है। –

+0

मुझे यकीन नहीं है कि आपको कुकी के मूल्य या पथ को सेट करना चाहिए क्योंकि इसे एक अलग कुकी के रूप में देखा जा सकता है, है ना? कुकी को साफ़ करने के लिए आपको केवल अधिकतम आयु 0 होना चाहिए। – Gray