2012-06-10 17 views
8

मुझे 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(); 
} 
+0

क्या यह कोई सवाल है? ऐसा लगता है कि आप जो कुछ भी कर रहे हैं उसे सूचीबद्ध कर रहे हैं। क्या आप पूछ रहे हैं कि यह एक अच्छा विचार है या नहीं? मुझे लगता है कि यह नहीं है। यह कोड थ्रेड-सुरक्षित नहीं है। केवल लॉकिंग सुनिश्चित करेगा कि प्रत्येक थ्रेड केवल इसका इच्छित कुकीस्टोर देखता है। यदि आप कर सकते हैं तो मैं HttpClient का उपयोग करने की सलाह देता हूं। आप यहां इस तरह की कोड समीक्षा पोस्ट करने पर विचार कर सकते हैं http://codereview.stackexchange.com/ –

+0

सहमत हैं, लेकिन आपको लगता है कि यह कोड थ्रेड-सुरक्षित क्यों नहीं है? – nivs

+0

मैंने इसे गलत तरीके से पढ़ा। मुझे कोई थ्रेडिंग समस्या नहीं दिख रही है। केवल नकारात्मक मुझे लगता है कि आपको सूर्य आंतरिक कक्षा का संदर्भ देना था। क्या आपको इससे कोई समस्या है? –

उत्तर

2

चालू ई के आसपास काम कुकी को सीधे भेजने के बजाय कुकी हेडर का उपयोग करना होगा। यहां कुकी हेडर देखें: https://msdn.microsoft.com/en-us/library/windows/desktop/aa384321(v=vs.85).aspx जो आप प्रत्येक कॉल को बदल सकते हैं।

Cookie: <name>=<value> [;<name>=<value>]...