मुझे HttpURLConnection का उपयोग करके एक साथ कई थ्रेड से वेबसाइट से कनेक्ट करने की आवश्यकता है, लेकिन प्रत्येक कनेक्शन के लिए अलग-अलग कुकीज़ का उपयोग करें। चूंकि जावा केवल वैश्विक कुकी मैनेजर सेट करने का समर्थन करता है, इसलिए मैंने निम्नलिखित हैक लागू किया है।एचटीपीआरएल कनेक्शन और जावा में कुकी मैनेजर का उपयोग करके प्रत्येक कनेक्शन के लिए विभिन्न कुकीज़ का उपयोग कैसे करें
इसके बजायCookieHandler.setDefault(new CookieManager())
बुलाने की
, मैं एक कस्टम CookieHandler
जो हर धागा है, जो प्रत्येक अनुरोध के बाद मंजूरी दे दी है के लिए एक अलग CookieStore
उदाहरण का उपयोग करता है क्रियान्वित किया है।
मैंने नामक कक्षा बनाई है जिसे CookieManager
पर आधारित किया गया है।
cookieJar
सदस्य चर हटा दिया गया था, और इसका उपयोग getCookieStore()
द्वारा प्रतिस्थापित कर दिया गया है।
निम्नलिखित कोड जोड़ा गया है:
CookieHandler.setDefault(SessionCookieManager.getInstance());
प्रत्येक अनुरोध के बाद, वर्तमान थ्रेड CookieStore
को मंजूरी दे दी है:
public class SessionCookieManager extends CookieHandler {
private final static SessionCookieManager ms_instance = new SessionCookieManager();
public static SessionCookieManager getInstance() {
return ms_instance;
}
private final static ThreadLocal<CookieStore> ms_cookieJars = new ThreadLocal<CookieStore>() {
@Override
protected synchronized CookieStore initialValue() { return new sun.net.www.protocol.http.InMemoryCookieStore(); }
};
public void clear() {
getCookieStore().removeAll();
}
public CookieStore getCookieStore() {
return ms_cookieJars.get();
}
पहले अनुरोध करने से पहले, कस्टम CookieManager
वैश्विक डिफ़ॉल्ट CookieHandler
के रूप में सेट किया गया है :
try {
...
} finally {
SessionCookieManager.getInstance().clear();
}
क्या यह कोई सवाल है? ऐसा लगता है कि आप जो कुछ भी कर रहे हैं उसे सूचीबद्ध कर रहे हैं। क्या आप पूछ रहे हैं कि यह एक अच्छा विचार है या नहीं? मुझे लगता है कि यह नहीं है। यह कोड थ्रेड-सुरक्षित नहीं है। केवल लॉकिंग सुनिश्चित करेगा कि प्रत्येक थ्रेड केवल इसका इच्छित कुकीस्टोर देखता है। यदि आप कर सकते हैं तो मैं HttpClient का उपयोग करने की सलाह देता हूं। आप यहां इस तरह की कोड समीक्षा पोस्ट करने पर विचार कर सकते हैं http://codereview.stackexchange.com/ –
सहमत हैं, लेकिन आपको लगता है कि यह कोड थ्रेड-सुरक्षित क्यों नहीं है? – nivs
मैंने इसे गलत तरीके से पढ़ा। मुझे कोई थ्रेडिंग समस्या नहीं दिख रही है। केवल नकारात्मक मुझे लगता है कि आपको सूर्य आंतरिक कक्षा का संदर्भ देना था। क्या आपको इससे कोई समस्या है? –