2012-06-27 20 views
8

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

समस्या यह है कि यह webservice सत्र का उपयोग करता है ... और मेरा सत्र मेरे वेब व्यू में है, इसलिए httpclient में यह नहीं है और मैं webservice की सामग्री तक नहीं पहुंच सकता।

मुझे इस समस्या के बारे में कई पोस्ट दिखाई देती हैं लेकिन मुझे समाधान समझ में नहीं आया।

यहाँ क्या मैं अपने onPageStarted पर किया था:

CookieManager mgr = CookieManager.getInstance(); 
Log.i("URL", url); 
Log.i("Cookie",mgr.getCookie("mywebsite.com")); 
String cookie_string = mgr.getCookie("mywebsite.com"); 
if(cookie_string.length() > 1) {      
    Data.instance().getPref().edit().putString("cookie",cookie_string).commit(); 
} 

मैंने देखा कि मैं चीजों को इस तरह का है, इसलिए मुझे आशा है कि उन लोगों के भी सत्र में शामिल हैं कि: (मैं नंबर निकालने के लिए)

__utma=......(number)......; 

__utmc=number; 

__utmz=number.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); 

wt3_eid=%number%number; 

wt3_sid=%number 

तब मुझे नहीं पता कि इस कुकी को मेरे httpclient में सेट करने के लिए क्या करना है। मुझे लगता है कि कोशिश, कोई सफलता के साथ:

HttpClient client = new DefaultHttpClient(); 
BasicCookieStore cookieStore = new BasicCookieStore(); 
String login_cookie_string = Data.instance().getPref().getString("cookie", ""); 
String[] cookie_parts = null; 
if(login_cookie_string.length()> 0) 
{ 

    //debug_view.setText(login_cookie_string); 
    Log.d("COOKIE", login_cookie_string); 
    cookie_parts = login_cookie_string.split(";"); 

    for(int t=0;t < cookie_parts.length;t++) 
    { 
     String[] cookieContent = cookie_parts[t].split("="); 
     Cookie login_cookie = new BasicClientCookie(cookieContent[0],cookieContent[1]); 
     ((BasicClientCookie) login_cookie).setDomain("mywebsite.com"); 
     cookieStore.addCookie(login_cookie); 
    } 

} 
((AbstractHttpClient) client).setCookieStore(cookieStore); 
+0

WebView और httpclient अनुरोधों के बीच शेष अंतर जानने के लिए वेबस्कार्ब या फिडलर जैसे प्रॉक्सी के माध्यम से यातायात को रूट करें। – Robert

उत्तर

10

इस tuto का पालन करें:

http://metatroid.com/article/Android:%20handling%20web%20service%20authentication

====================== ========= यहां वेबपृष्ठ की सामग्री =====

कुछ ऐसा जो आप एंड्रॉइड में कर सकते हैं वह वेब प्रमाणीकरण है। अधिकांश वेबसाइटें सत्र आईडी को ट्रैक करने और उपयोगकर्ता को लॉग इन रखने के लिए कुकी जारी करती हैं। इस प्रमाणीकरण को बनाए रखने के लिए, आपको गतिविधियों और http क्लाइंट्स और वेबव्यू के बीच कुकीज़ को समन्वयित करने की आवश्यकता होगी।

जिस विधि को मैं समाप्त कर रहा हूं, जो कि काफी अच्छा काम करता है, वह एक वर्ग बनाने के लिए था जो अनुप्रयोग को बढ़ाता है, फिर शेष एचटीपी क्लाइंट को शेष एप्लिकेशन में उपयोग करने के लिए परिभाषित करता है।

public class AppSettings extends Application { 
    private static final DefaultHttpClient client = createClient(); 

    @Override 
    public void onCreate(){ 
    } 

    static DefaultHttpClient getClient(){ 
      return client; 
    } 
    private static DefaultHttpClient createClient(){ 
      BasicHttpParams params = new BasicHttpParams(); 
      SchemeRegistry schemeRegistry = new SchemeRegistry(); 
      schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
      final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); 
      schemeRegistry.register(new Scheme("https", sslSocketFactory, 443)); 
      ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); 
      DefaultHttpClient httpclient = new DefaultHttpClient(cm, params); 
      httpclient.getCookieStore().getCookies(); 
      return httpclient; 
    } 

इस वर्ग भी एक HttpClient AsyncTasks के लिए उपयुक्त और एकाधिक HTTP अनुरोध कर रहा है कि बनाता है: जैसे कि कोड लग रहा है। ClientConnectionManager के लिए ThreadSafeClientConnManager का उपयोग करने दें, जब आप बैक बटन दबाते हैं और दूसरा, या तीसरा प्रारंभ करते हैं तो आप बल को बंद करने के बिना AsyncTasks के अंदर http अनुरोध चलाते हैं।

यह एक एकल डिफ़ॉल्ट कुकी स्टोर भी बनाता है जिसे आपकी सभी गतिविधियों में एक्सेस किया जा सकता है। GetClient() विधि को कॉल करके आप इसे अन्य गतिविधियों में उपयोग करेंगे।

उदाहरण

public class SomeActivity extends Activity { 
     static DefaultHttpClient mClient = AppSettings.getClient(); 
     ... 
     try { 

      HttpGet httpget = new HttpGet('URL'); 
      HttpResponse response; 
      response = mClient.execute(httpget); 
      ... 
     } 
     ... 
    } 

आप यह आवश्यक वेब दृश्य का उपयोग करें और पहुँच सकते हैं और अपने ग्राहक के रूप में ही कुकीज़ का उपयोग करने के लिए इसकी आवश्यकता मिल जाए लिए

। (OnPageStarted विधि में)

DefaultHttpClient mClient = AppSettings.getClient(); 


Cookie sessionInfo; 
List<Cookie> cookies = mClient.getCookieStore().getCookies(); 

if (! cookies.isEmpty()){ 
     CookieSyncManager.createInstance(getApplicationContext()); 
     CookieManager cookieManager = CookieManager.getInstance(); 

     for(Cookie cookie : cookies){ 
       sessionInfo = cookie; 
       String cookieString = sessionInfo.getName() + "=" + sessionInfo.getValue() + "; domain=" + sessionInfo.getDomain(); 
       cookieManager.setCookie("example.com", cookieString); 
       CookieSyncManager.getInstance().sync(); 
     } 
} 

आप सही डोमेन example.com की स्विच करना होगा: आप ग्राहक की कुकी स्टोर CookieManager का उपयोग कर सिंक कर सकते हैं।

+0

लिंक – Skynet

15

तो, यह मैं क्या किया है और यह मेरे लिए काम किया -
विधि आवेदन CookieManager से किसी दिए गए यूआरएल के लिए कुकीज़ हो जाता है -

HttpRequestBase request = new HttpGet(uri); 
request.addHeader("Cookie", getCookieFromAppCookieManager(uri.toString())); 

अब getCookieFromAppCookieManager के लिए implmentation इस प्रकार है। एप्लिकेशन कुकी मैनेजर किसी एप्लिकेशन के वेबव्यू उदाहरणों द्वारा उपयोग की जाने वाली कुकीज़ का प्रबंधन करता है।

@param url the URL for which the cookies are requested 
@return value the cookies as a string, using the format of the 'Cookie' HTTP request header 
@throws MalformedURLException 


public static String getCookieFromAppCookieManager(String url) throws MalformedURLException { 
    CookieManager cookieManager = CookieManager.getInstance(); 
    if (cookieManager == null) 
     return null; 
    String rawCookieHeader = null; 
    URL parsedURL = new URL(url); 

    // Extract Set-Cookie header value from Android app CookieManager for this URL 
    rawCookieHeader = cookieManager.getCookie(parsedURL.getHost()); 
    if (rawCookieHeader == null) 
     return null; 
    return rawCookieHeader; 
} 
+0

साझा करने के लिए धन्यवाद – Dahevos

+0

साझा करने के लिए धन्यवाद .. –

+0

यदि आप चाहते हैं कि मेरे लिए अच्छी तरह से काम करता है तो मूल कोड (यानी httpclient) – 2cupsOfTech

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