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


135

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

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

जवाबों:


138

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

से API दस्तावेज़ :

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

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

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
मुझे यकीन नहीं है कि आपको कुकी के मूल्य या पथ को सेट करना चाहिए क्योंकि यह एक अलग कुकी के रूप में देखा जा सकता है, है ना? एक कुकी को साफ़ करने के लिए आपको अधिकतम आयु
ग्रे

2
जब कुकी बनाई गई थी (जो कुकी नाम और डोमेन के लिए समान थी) जो भी पथ का उपयोग करने के लिए cookie.setPath (...) से मेल खाना चाहिए।
मार्कस

12

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

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

इसे डीबग करने के लिए, फ़ायरफ़ॉक्स की प्राथमिकताओं में जाएं -> सुरक्षा टैब, और 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
बदली हुई कुकी को प्रतिक्रिया के साथ प्रतिक्रिया में जोड़ना न भूलें ।addCookie (कुकीज़ [i]);
फिलाहॉप बुस्बी

7

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.