2012-05-23 12 views
12

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

समस्या यह है कि जब मुझे कैप्चा I के अनुरोध के बाद HttpURLConnection को बंद करना है तो पता लगाएं कि उत्तर अलग-अलग सत्र पर अलग-अलग सत्र पर चल रहा है। इस वजह से कैप्चा चेक विफल रहता है क्योंकि यह सत्र निर्भर है।

क्या कनेक्शन को जीवित रखने का कोई तरीका है या क्या मुझे एक अलग पथ का पालन करना चाहिए? मुझे पता है कि समकक्ष आईफोन एप्लिकेशन में वे "जुड़े" रहते हैं और इस प्रकार एक ही सत्रिक होता है।

संपादित करें:

CookieManager cookieManager = new CookieManager(); 
    CookieHandler.setDefault(cookieManager); 

    URL urlObj = new URL(urlPath); 
    conn = (HttpURLConnection) urlObj.openConnection(); 

    if (urlPath.toLowerCase().startsWith("https:")) { 
     initializeHttpsConnection((HttpsURLConnection) conn); 
    } 
    conn.setRequestMethod("POST"); 
    conn.setRequestProperty("Content-Language", "en-US"); 
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
    conn.setRequestProperty("Content-Length", Integer.toString(bodyData.length)); 
    if (_sessionIdCookie != null) { 
     conn.setRequestProperty("Cookie", _sessionIdCookie); 
    } 
    // Connect 
    conn.setDoInput(true); 
    conn.setDoOutput(true); 
    conn.connect(); 

उत्तर

13

आम तौर पर, सत्र http कनेक्शन पर ही आधारित नहीं रखा जाता। इससे कोई मतलब नहीं होगा। सत्र आमतौर पर क्लाइंट साइड पर कुकी के माध्यम से और सर्वर की ओर से सत्र जानकारी के माध्यम से जीवित रखा जाता है। आपको जो करना होगा वह कुकी (ओं) को सहेजना है और फिर अगली बार सर्वर से कनेक्ट होने पर (उन) कुकी को सेट करना है। http://developer.android.com/reference/java/net/HttpURLConnection.html

यह एक छोटा सा अंश पाने के लिए आप शुरू कर दिया:

स्थापित करने और एक संभावित बनाए रखने के लिए

कैसे सत्र और HttpUrlConnection वर्ग के साथ कुकीज़ के साथ काम करने के बारे में अधिक जानने के लिए दस्तावेज़ पढ़ें क्लाइंट और सर्वर के बीच दीर्घकालिक सत्र, HttpURLConnection में एक एक्स्टेंसिबल कुकी प्रबंधक शामिल है। CookieHandler और CookieManager का उपयोग कर वीएम चौड़ा कुकी प्रबंधन सक्षम करें:

CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

संपादित करें:

एपीआई स्तर 8 या उससे पहले के साथ काम करने वालों के लिए, आप अपाचे के पुस्तकालय का उपयोग करना होगा!

यहाँ कुछ संदर्भ कोड है:

// Create a local instance of cookie store 
    CookieStore cookieStore = new BasicCookieStore(); 

    // Create local HTTP context 
    HttpContext localContext = new BasicHttpContext(); 
    // Bind custom cookie store to the local context 
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

    HttpGet httpget = new HttpGet("http://www.google.com/"); 

    System.out.println("executing request " + httpget.getURI()); 

    // Pass local context as a parameter 
    HttpResponse response = httpclient.execute(httpget, localContext); 

कोड ऊपर अपाचे के पुस्तकालय उदाहरण से लिया गया है। यह यहां पाया जा सकता: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientCustomContext.java

संपादित करें 2: बनाना यह स्पष्ट: के माध्यम से कि

अपाचे पुस्तकालय आप किसी भी तरह कनेक्शन वस्तु के साथ कुकी प्रबंधन वस्तु "कनेक्ट" की जरूरत के लिए और आप कर HttpContext ऑब्जेक्ट।

HttpUrlConnection के मामले में आवश्यक नहीं है। जब आप कुकी हैन्डलर की स्थिर विधि setDefault का उपयोग करते हैं, तो आप सिस्टम-व्यापी कुकी हैंडलर सेट कर रहे हैं। नीचे CookieHandler.java से एक अंश है।नोट (एंड्रॉयड ओपन सोर्स प्रोजेक्ट के (AOSP) रिपोजिटरी से) अलग-अलग नाम:

37 /** 
38  * Sets the system-wide cookie handler. 
39  */ 
40  public static void setDefault(CookieHandler cHandler) { 
41   systemWideCookieHandler = cHandler; 
42  } 
+0

के अंदर एप्लिकेशन लॉन्च पर हो सकता है एक बार मैंने "कुकी मैनेजर" को परिभाषित किया है, तो क्या मैं सत्रिक धारण करता हूं? – theblitz

+0

ठीक है, मेरे पास आपके लिए एक महत्वपूर्ण सवाल है: क्या आप एपीआई 9 + (2.3+) का उपयोग कर रहे हैं? यदि हां, तो आप इसे जोड़ने से पहले बस जोड़ लें, आपको ठीक होना चाहिए। यदि आप 2.2 या उससे कम का उपयोग कर रहे हैं तो आपको org.apache पैकेज से HttpClient का उपयोग करना चाहिए। यदि आप 2.2 के लिए कर रहे हैं तो मैं कुछ उदाहरण कोड जोड़ूंगा। – DallaRosa

+0

इस समय यह 2.3 पर सेट है लेकिन यह सुनिश्चित नहीं है कि हम इसे छोड़ने जा रहे हैं। इसे शीर्ष 2.2 नीचे छोड़ दें लेकिन सुनिश्चित नहीं है। ऐसा लगता है कि यहां 99% डिवाइस 2.3+ हैं, इसलिए ठीक होना चाहिए। – theblitz

11

सत्र बनाए रखने के लिए HttpURLConnection का उपयोग कर आप हर कनेक्शन पर

CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

केवल एक बार और नहीं इस हिस्से पर अमल करने की जरूरत है। अच्छा उम्मीदवार Application.onCreate();

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

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