2011-11-10 11 views
10

http getの一部としてCookieを送信できません。まず、私はクッキーを与えるwebview内のログインページに行きます。チェックして、クッキーがCookieManagerに保存されています。次に、BasicHttpRequestを使用して、同じドメインから特定のURLを取得します。私はログインから取得したクッキーがgetのために私のヘッダーに添付されることを期待しますが、Wiresharkでそれを見るのはそこにはありません。私はGoogleで検索し、同様の質問をたくさん読んでいることを確認してきました。私はセッションからの私のクッキーが続くだろう期待したいので、私はCookieSyncManagerを使用していますAndroidでBasicHttpRequestを使用してwebviewからCookieを共有する

  • 。 CookieSyncManagerが非同期であることは問題ではないと思います。なぜなら、5秒ごとにURLにアクセスし続け、Cookieが追加されないためです。
  • 私のcookieストアについてhttpリクエストを伝える必要があると思われますが、私が検索した解決策は私のためにはコンパイルされません。私はcontext.setAttribute(ClientContext.COOKIE_STORE、this.cookieStore)のように見えますが、CookieManagerからデフォルトのCookieStoreを取得する方法はわかりません。いくつかのコードはcookieManager.getCookieStore()を呼び出すようですが、Androidでは私のためにコンパイルされません。ドキュメントを見ると、怒っているCookieStoreを取得する方法が見当たりません。明白なものがありませんか?私の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; 
} 

そして、実際に作るために:

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); 

その後クッキーをチェックするための私のコードがあるように見えています私の行う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; 
} 

読んでいただきありがとうこれまでのg!ありがたく受け取った任意の提案、

エイミー

+0

params.setParameter( "cookie"、cookie)を試しましたか? CookieはCookieStoreの有効なCookieです。 –

+0

こんにちはFranziskus、私はparams.setParameter( "cookie"、cookie)を試したところ、paramsに5つのエントリがあることがわかりましたが、Cookieの部分はWiresharkを使って見たようにhttpに入りません。 –

答えて

3

は最終的に私のために働いているクッキーを取り付け!私はそれを一番簡単な方法でやっていないかもしれないが、少なくともそれは機能する。私の大きなブレークスルーは、アンドロイドソースをダウンロードして添付していたので、何が起きているのかを確認してみることができました。ここに指示がありますhttp://blog.michael-forster.de/2008/12/view-android-source-code-in-eclipse.html - 一番簡単なダウンロードのために下にスクロールし、Volureからのコメントを読んでください。 Androidで開発している場合は、これを行うことを強くお勧めします。

作業中のクッキーコードに変更が加えられました。ほとんどの変更は、実際に私のウェブページを取得するコードにありました.COOKIE_STOREとCOOKIESPEC_REGISTRYを設定する必要がありました。クッキーコードがManagedClientConnectionにキャストされたため、その後、私はまた私の接続の種類を変更する必要がありました:

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は()のように見えるのと同じクラスで、私のクッキーの生活を設定するための私のコード:

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... 
} 

似たような問題を抱えていると、これが助けてくれることを本当に願っています。私は数週間壁に頭を打つような気がします!今すぐお勧めのお茶をお召し上がりください:o)

関連する問題