2011-11-10 10 views
10

मुझे http प्राप्त करने के हिस्से के रूप में कुकीज़ भेजने में समस्या हो रही है। सबसे पहले मैं एक वेबव्यू के भीतर एक लॉगिन पेज पर जाता हूं जो मुझे एक कुकी देता है। मैंने चेक किया है और कुकी को कुकी मैनेजर में संग्रहीत किया जा रहा है। फिर मैं एक ही डोमेन से एक विशेष यूआरएल प्राप्त करने के लिए BasicHttpRequest का उपयोग करता हूं। मुझे उम्मीद है कि मुझे प्राप्त होने वाली कुकी को मेरे हेडर से मिलने के लिए जोड़ा जाएगा, लेकिन इसे वायरसहार्क में देखकर यह वहां नहीं है। मैंने गुमराह किया है और बहुत सारे प्रश्न पढ़े हैं और यह सुनिश्चित कर लिया है कि:Android पर BasicHttpRequest के साथ वेबव्यू से कुकीज़ साझा करना

  • मैं कुकी सिंक मैनेजर का उपयोग कर रहा हूं इसलिए मुझे उम्मीद है कि सत्र से मेरी कुकीज़ जारी रहेगी। मुझे नहीं लगता कि यह कुकी सिंकमैनगर के रूप में असीमित होने में एक समस्या है क्योंकि मैं हर 5 सेकंड में यूआरएल मारता रहता हूं और कुकी कभी नहीं जोड़ा जाता है।
  • मुझे संदेह है कि मुझे अपने कुकी स्टोर के बारे में अपना http अनुरोध बताने की ज़रूरत है, लेकिन जिन समाधानों को मैंने गुम किया है, वे मेरे लिए संकलित नहीं हैं। ऐसा लगता है कि मैं कुछ ऐसा करना चाहता हूं जो context.setAttribute (ClientContext.COOKIE_STORE, this.cookieStore) जैसा दिख रहा है, लेकिन मैं यह नहीं समझ सकता कि कुकी मैनेजर से डिफ़ॉल्ट कुकीस्टोर कैसे प्राप्त करें। कुछ कोड cookieManager.getCookieStore() को कॉल करते हैं, लेकिन यह एंड्रॉइड पर मेरे लिए संकलित नहीं करता है। दस्तावेज़ों को देखते हुए मैं कुकीस्टोर को पाने के लिए एक रास्ता नहीं देख सकता जो पागल लगता है - क्या मुझे कुछ याद आ रही है?

मेरी वेबव्यू में प्रवेश पृष्ठ शुरू करने मेरे कोड लगता है:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // use cookies to remember a logged in status 
    CookieSyncManager.createInstance(this); 
    CookieSyncManager.getInstance().startSync(); 

    //not sure if I need to do this 
    CookieManager cookie_manager = CookieManager.getInstance(); 
    cookie_manager.setAcceptCookie(true); 

    webview = new WebView(this); 
    webview.getSettings().setJavaScriptEnabled(true); 
    webview.setWebViewClient(new HelloWebViewClient()); // if user clicks on a url we need to steal that click, also steal the back button 
    webview.loadUrl("http://"+my_server+"/api/v1/login"); 
    setContentView(webview); 

तब कुकी की जाँच करने के लिए अपने कोड है वहाँ की तरह दिखता है:

public static boolean CheckAuthorised() { 
    CookieSyncManager.getInstance().sync(); 
    CookieManager cookie_manager = CookieManager.getInstance(); 

    String cookie_string = cookie_manager.getCookie("http://"+my_server+"/api/v1/login"); 
    System.out.println("lbp.me cookie_string: " + cookie_string); 

    if(cookie_string != null) 
    { 
     String[] cookies = cookie_string.split(";"); 
     for (String cookie : cookies) 
     { 
      if(cookie.matches("API_AUTH=.*")) 
      { 
       // maybe we need to store the cookie for the root of the domain? 
       cookie_manager.setCookie("http://"+my_server, cookie_string); 
       // maybe we need to store the cookie for the url we're actually going to access? 
       cookie_manager.setCookie("http://"+my_server+"/api/v1/activity", cookie_string);  

       CookieSyncManager.getInstance().sync(); 
       return true; 
      } 
     } 
    } 

    return false; 
} 

और वास्तव में बनाने के लिए http अनुरोध मैं

public static HttpResponse getMeAWebpage(String host_string, int port, String url) 
     throws Exception { 
    HttpParams params = new BasicHttpParams(); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
    HttpProtocolParams.setContentCharset(params, "UTF-8"); 
    HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1"); 
    HttpProtocolParams.setUseExpectContinue(params, true); 

    BasicHttpProcessor httpproc = new BasicHttpProcessor(); 
    // Required protocol interceptors 
    httpproc.addInterceptor(new RequestContent()); 
    httpproc.addInterceptor(new RequestTargetHost()); 
    // Recommended protocol interceptors 
    httpproc.addInterceptor(new RequestConnControl()); 
    httpproc.addInterceptor(new RequestUserAgent()); 
    httpproc.addInterceptor(new RequestExpectContinue()); 

    HttpRequestExecutor httpexecutor = new HttpRequestExecutor(); 

    HttpContext context = new BasicHttpContext(null); 
    // HttpHost host = new HttpHost("www.svd.se", 80); 
    HttpHost host = new HttpHost(host_string, port); 

    DefaultHttpClientConnection conn = new DefaultHttpClientConnection(); 
    ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy(); 

    context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); 
    context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host); 
    //CookieManager cookie_manager = CookieManager.getInstance(); 
    //CookieStore cookie_store = cookie_manager.getCookieStore(); //The method getCookieStore() is undefined for the type CookieManager 
    //context.setAttribute(ClientContext.COOKIE_STORE, cookie_store); 

    HttpResponse response = null; 

    try { 
     if (!conn.isOpen()) { 
      Socket socket = new Socket(host.getHostName(), host.getPort()); 
      conn.bind(socket, params); 
     } 

     BasicHttpRequest request = new BasicHttpRequest("GET", url); 
     System.out.println(">> Request URI: " 
       + request.getRequestLine().getUri()); 
     System.out.println(">> Request: " 
       + request.getRequestLine()); 

     request.setParams(params); 
     httpexecutor.preProcess(request, httpproc, context); 
     response = httpexecutor.execute(request, conn, context); 
     response.setParams(params); 
     httpexecutor.postProcess(response, httpproc, context); 

     String ret = EntityUtils.toString(response.getEntity()); 
     System.out.println("<< Response: " + response.getStatusLine()); 
     System.out.println(ret); 
     System.out.println("=============="); 
     if (!connStrategy.keepAlive(response, context)) { 
      conn.close(); 
     } else { 
      System.out.println("Connection kept alive..."); 
     } 
    } catch(UnknownHostException e) { 
     System.out.println("UnknownHostException"); 
    } catch (HttpException e) { 
     System.out.println("HttpException"); 
    } finally { 
     conn.close(); 
    } 

    return response; 
} 

रीडिन के लिए धन्यवाद जी अब तक! कोई सुझाव कृतज्ञता प्राप्त किया,

एमी

+0

क्या आपने पैराम्स.सेट पैरामीटर ("कुकी", कुकी) की कोशिश की है? जबकि कुकी आपके कुकीस्टोर से वैध कुकी है। –

+0

हाय फ्रांजिस्कस, मैंने अभी पैराम्स.सेट पैरामीटर ("कुकी", कुकी) की कोशिश की है, और मैं देख सकता हूं कि पैराम्स में अब 5 प्रविष्टियां हैं, लेकिन कुकी भाग इसे कभी भी http में वायरसहार्क का उपयोग करके नहीं देखता है। –

उत्तर

3

कुकीज़ अटैच किया जा रहा अंत में मेरे लिए काम कर रहा है! मैंने इसे सबसे आसान तरीका नहीं किया होगा, लेकिन कम से कम यह काम करता है। मेरी बड़ी सफलता एंड्रॉइड स्रोतों को डाउनलोड और संलग्न कर रही थी, ताकि मैं आगे बढ़ सकूं और देख सकूं कि क्या हो रहा था। यहां निर्देश हैं http://blog.michael-forster.de/2008/12/view-android-source-code-in-eclipse.html - नीचे स्क्रॉल करें और सरल डाउनलोड के लिए वॉल्यूम से टिप्पणी पढ़ें। यदि आप एंड्रॉइड पर विकास कर रहे हैं तो मैं अत्यधिक अनुशंसा करता हूं।

अब कामकाजी कुकीज़ कोड पर - अधिकांश परिवर्तन कोड में थे जो वास्तव में मुझे अपना वेबपृष्ठ प्राप्त करता है - मुझे एक COOKIE_STORE और एक COOKIESPEC_REGISTRY सेट करना पड़ा।

public static void SetCookie(String auth_cookie, String domain) 
{ 
    String[] cookie_bits = auth_cookie.split("="); 
    cookie = new BasicClientCookie(cookie_bits[0], cookie_bits[1]); 
    cookie.setDomain(domain); // domain must not have 'http://' on the front 
    cookie.setComment("put a comment here if you like describing your cookie"); 
    //cookie.setPath("/blah"); I don't need to set the path - I want the cookie to apply to everything in my domain 
    //cookie.setVersion(1); I don't set the version so that I get less strict checking for cookie matches and am more likely to actually get the cookie into the header! Might want to play with this when you've got it working... 
} 
:

public static HttpResponse getMeAWebpage(String host_string, int port, String url) 
     throws Exception { 
    HttpParams params = new BasicHttpParams(); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
    HttpProtocolParams.setContentCharset(params, "UTF-8"); 
    HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1"); 
    HttpProtocolParams.setUseExpectContinue(params, true); 
    //params.setParameter("cookie", cookie); 

    BasicHttpProcessor httpproc = new BasicHttpProcessor(); 
    // Required protocol interceptors 
    httpproc.addInterceptor(new RequestContent()); 
    httpproc.addInterceptor(new RequestTargetHost()); 
    // Recommended protocol interceptors 
    httpproc.addInterceptor(new RequestConnControl()); 
    httpproc.addInterceptor(new RequestUserAgent()); 
    httpproc.addInterceptor(new RequestExpectContinue()); 
    httpproc.addInterceptor(new RequestAddCookies()); 


    HttpRequestExecutor httpexecutor = new HttpRequestExecutor(); 

    HttpContext context = new BasicHttpContext(null); 
    // HttpHost host = new HttpHost("www.svd.se", 80); 
    HttpHost host = new HttpHost(host_string, port); 
    HttpRoute route = new HttpRoute(host, null, false); 

    // Create and initialize scheme registry 
    SchemeRegistry schemeRegistry = new SchemeRegistry(); 
    schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); 

    SingleClientConnManager conn_mgr = new SingleClientConnManager(params, schemeRegistry); 
    ManagedClientConnection conn = conn_mgr.getConnection(route, null /*state*/); 
    ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy(); 

    context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); 
    context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host); 

    CookieStore cookie_store = new BasicCookieStore(); 
    cookie_store.addCookie(cookie); 
    context.setAttribute(ClientContext.COOKIE_STORE, cookie_store); 

    // not sure if I need to add all these specs, but may as well 
    CookieSpecRegistry cookie_spec_registry = new CookieSpecRegistry(); 
    cookie_spec_registry.register(
      CookiePolicy.BEST_MATCH, 
      new BestMatchSpecFactory()); 
    cookie_spec_registry.register(
      CookiePolicy.BROWSER_COMPATIBILITY, 
      new BrowserCompatSpecFactory()); 
    cookie_spec_registry.register(
      CookiePolicy.NETSCAPE, 
      new NetscapeDraftSpecFactory()); 
    cookie_spec_registry.register(
      CookiePolicy.RFC_2109, 
      new RFC2109SpecFactory()); 
    cookie_spec_registry.register(
      CookiePolicy.RFC_2965, 
      new RFC2965SpecFactory()); 
    //cookie_spec_registry.register(
    //  CookiePolicy.IGNORE_COOKIES, 
    //  new IgnoreSpecFactory()); 
    context.setAttribute(ClientContext.COOKIESPEC_REGISTRY, cookie_spec_registry); 

    HttpResponse response = null; 

    try { 
     if (!conn.isOpen()) { 
      conn.open(route, context, params); 
     } 

     BasicHttpRequest request = new BasicHttpRequest("GET", url); 
     System.out.println(">> Request URI: " 
       + request.getRequestLine().getUri()); 
     System.out.println(">> Request: " 
       + request.getRequestLine()); 

     request.setParams(params); 
     httpexecutor.preProcess(request, httpproc, context); 
     response = httpexecutor.execute(request, conn, context); 
     response.setParams(params); 
     httpexecutor.postProcess(response, httpproc, context); 

     String ret = EntityUtils.toString(response.getEntity()); 
     System.out.println("<< Response: " + response.getStatusLine()); 
     System.out.println(ret); 
     System.out.println("=============="); 
     if (!connStrategy.keepAlive(response, context)) { 
      conn.close(); 
     } else { 
      System.out.println("Connection kept alive..."); 
     } 
    } catch(UnknownHostException e) { 
     System.out.println("UnknownHostException"); 
    } catch (HttpException e) { 
     System.out.println("HttpException"); 
    } finally { 
     conn.close(); 
    } 

    return response; 
} 

getMeAWebpage (के रूप में एक ही कक्षा में मेरी कुकी जीवन स्थापित करने के लिए मेरे कोड) की तरह दिखता है: तो फिर मैं भी क्योंकि कुकीज़ कोड एक ManagedClientConnection करने के लिए इसे कास्टिंग था मेरी कनेक्शन प्रकार बदलना पड़ा

मुझे उम्मीद है कि अगर आपको ऐसी ही समस्याएं आ रही हैं तो मुझे उम्मीद है कि मुझे मदद मिलती है - मुझे लगता है कि मैं कुछ हफ्तों तक दीवार के खिलाफ अपने सिर को टक्कर लगी हूं! अब चाय के एक अच्छी तरह से योग्य उत्सव कप के लिए: ओ)

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