2012-12-15 13 views
9

को नहीं हटाता है मैं कुकी मैनेजर.getInstance() को हटाता हूं। मेरे ऐप में क्रिएटऑलकुकी() को हटाएं।कुकी मैनेजर .getInstance()। RemoveAllCookie(); सभी कुकीज़

मैं एक अजीब मुद्दे में भाग रहा हूं जहां मुझे एक अप्रत्याशित कुकी मूल्य एक जीईटी अनुरोध में पारित किया जा रहा है। वास्तव में, कुकी मूल्य वास्तव में, वास्तव में पुराना मान है।

ये कदम उठाएँ मैं परीक्षण के लिए प्रदर्शन कर रहे हैं:

  1. एप्लिकेशन
  2. स्थापित एप्लिकेशन लॉन्च पर GET अनुरोध करें। अनुरोध साफ होना चाहिए: कोई कुकीज़ नहीं भेजी जानी चाहिए।
  3. अनुरोध प्राप्त करें एक सेट-कुकी के साथ प्रतिक्रिया दें। मान अनुरोध समय पर आधारित है, इसलिए एक बहुत ही कम मौका है कि यह मान किसी भी दो अनुरोधों पर समान है।
  4. एक और जीईटी अनुरोध करें। अनुरोध चरण 3 से कुकी मूल्य भेजना चाहिए।

पहली बार जब मैंने ऐप इंस्टॉल किया था, तो कुकी व्यवहार ने ऊपर की अपेक्षा की थी। मैंने ऐप को अनइंस्टॉल किया, फिर इसे फिर से इंस्टॉल किया, और कुकी व्यवहार, फिर से, अपेक्षित के रूप में काम किया। मैं यह कुछ बार करता हूं, चीजें ठीक और बेवकूफ हैं।

फिर, अचानक, एनटी इंस्टॉल पर, चरण 2 पास नहीं होता है। पहला जीईटी अनुरोध साफ नहीं है। असल में, यह उस मान के साथ आता है जो ऐप के पहले इंस्टॉलेशन पर सेट किया गया था।

मैं इस समस्या को विश्वसनीय रूप से पुन: उत्पन्न नहीं कर सकता, लेकिन मैं इसे अक्सर देखता हूं। ऐसा नहीं है कि इंस्टॉल पर पहला जीईटी अनुरोध तत्काल पिछले इंस्टॉलेशन से कुकी मूल्य भेज रहा है - मान तीन या चार पिछले इंस्टॉलेशन से है जो के बाद अनइंस्टॉल करता है।

यह कैसे संभव है कि मैं इसे देख रहा हूं? मैं वास्तव में सभी ऐप की कुकीज़ कैसे हटा सकता हूं?

उत्तर

8

यह अंधेरे में एक शॉट है, लेकिन शायद अपने पहले की कुकीज़ को स्थायी संग्रह में हैं स्थापित करते हुए पुन: इंस्टॉल करने से लोगों को रैम में कैश कर रहे हैं। हो सकता है कि सभी कुकीज़ को हटाने की कार्रवाई को किसी कारण से लगातार भंडारण के लिए समन्वयित नहीं किया जा रहा है, इसलिए यह पुरानी मानों को पुनर्स्थापना के बीच रखता है।

CookieSyncManager (जोर मेरा) के लिये दस्तावेज का हवाला देते हुए:

CookieSyncManager रैम और स्थायी भंडारण के बीच ब्राउज़र कुकी दुकान सिंक्रनाइज़ करने के लिए प्रयोग किया जाता है। सर्वश्रेष्ठ प्रदर्शन प्राप्त करने के लिए, ब्राउज़र कुकीज़ को रैम में सहेजा जाता है। अलग थ्रेड टाइमर द्वारा संचालित के बीच कुकीज़ सहेजता है।

...

सिंक अंतराल 5 मिनट है, तो आप समन्वयित हो जाता है मैन्युअल रूप से वैसे भी, उदाहरण के लिए onPageFinished (WebView, स्ट्रिंग) में मजबूर करने के लिए चाहते हैं।ध्यान दें कि सिंक() भी होता है असीमित रूप से, इसलिए ऐसा न करें जैसे आपकी गतिविधि बंद हो रही है।

दृढ़ता से पता चलता है कि कि शायद जब एप्लिकेशन अनइंस्टॉल कर रहा था यह अभी तक sync'ed नहीं था, इसलिए से पुराने मूल्यों (अपने परीक्षण, यह मानें कि जो मैं कभी कभी कम से कम 5 मिनट के अंतराल में किए गए थे पर) पहली बार इस बिंदु पर लगातार भंडारण में स्थापित थे। मेरे पास यह मानने का कोई कारण नहीं है कि 5 मिनट अंतराल पारित नहीं होने पर सिंक अनइंस्टॉल के दौरान होता है।

यह एक प्रश्न छोड़ देता है: क्यों कभी-कभी कुछ कुकीज़ भेजी जाती हैं भले ही आपने उन्हें onCreate में साफ़ किया हो? यह removeAllCookieis also asynchronous दिखाता है - कभी-कभी यह आपका पहला अनुरोध करने से पहले पूरा हो जाएगा, कभी-कभी यह नहीं होगा, और बाद के मामले में यह उन मानों को भेजेगा जो अभी भी सक्रिय हैं: आपके पहले इंस्टॉल से जो अभी भी हैं लगातार भंडारण।

(कृपया ध्यान दें कि मैं अभी भी एंड्रॉइड विकास सीख रहा हूं, और मेरी कुछ धारणाएं गलत हो सकती हैं - कुकीज़ कैसे प्रबंधित की जाती हैं और activity's lifecycle में एक राज्य में किए गए एसिंक्रोनस कॉल के बारे में अभी भी अधूरा हो सकता है एक और रन चलाता है, लेकिन यह व्याख्या आपके द्वारा वर्णित व्यवहार के साथ काफी सुसंगत है)

0

कोड के नीचे बाहर का प्रयास करें:

BasicHttpContext mHttpContext;

CookieStore mCookieStore; 
String persistentcookie; 
CookieManager cookieManager; 
CookieSyncManager syncManager; 
private MultipartEntity m_hsmpeMultipartReqEntity; 

    //manages the session of the webview for the image uploading on the server. 
syncManager = CookieSyncManager.createInstance(m_hswvWebView.getContext()); 
syncManager.startSync(); 
cookieManager = CookieManager.getInstance(); 
boolean cok=cookieManager.acceptCookie(); // Here your cookie 
persistentcookie=cookieManager.getCookie("http://www.xxxx.com/");  
String[] splitstr=pat.split(persistentcookie.toString()); 
String key=splitstr[0]; // Key of the Cookie 
String value=splitstr[1]; //Session id 
m_hshttpClient = new DefaultHttpClient(); 
mHttpContext = new BasicHttpContext(); 
mCookieStore = m_hshttpClient.getCookieStore();   

BasicClientCookie clientcookie=new BasicClientCookie(key,value); 
clientcookie.setDomain(“www.xxxx.com”); // set the proper Domain URL 
mCookieStore.addCookie(clientcookie);    
m_hshttppostRequest = new HttpPost(“http://www.xxxx.com/"); 
// post URL after setting    cookie value. 

//set the cookie attribute in the BasicHTTPContext. 

mHttpContext.setAttribute(ClientContext.COOKIE_STORE, mCookieStore); 
m_hsmpeMultipartReqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 

m_hshttppostRequest.setEntity (m_hsmpeMultipartReqEntity); 
m_hshttpResponse = m_hshttpClient.execute(m_hshttppostRequest,mHttpContext); 
1

कृपया कुकी मैनेजर.getInstance() सिंक() को कुकी मैनेजर के बाद तुरंत कॉल करें .getInstance()। removeAllCookie() कॉल।

कारण @mgibsonbr द्वारा उल्लिखित कारण है, एक अलग थ्रेड एक टाइमर द्वारा संचालित कुकीज़ को बचाता है ताकि इसे तुरंत जारी किया जा सके ताकि इसे तुरंत कुकीज सिंकमैनगर.getInstance() सिंक() सिंक() सिंक कर सकें।

-1
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { 
     CookieManager.getInstance().removeAllCookies(null); 
    } else { 

     CookieSyncManager.createInstance(context); 
     CookieManager cookieManager = CookieManager.getInstance(); 
     if (cookieManager != null) { 
      cookieManager.removeAllCookie(); 
     } 
CookieSyncManager.getInstance().sync(); 
} 
+0

SO में आपका स्वागत है। कृपया कोड केवल जवाब छोड़ दें। Http://stackoverflow.com/help/how-to-answer देखें –

संबंधित मुद्दे