2012-06-27 91 views
8

私は実際にWebViewでログに記録されたセッションを持っています。 しかし、httpclientを使ってWebからデータを送信したり取得したりしています。私はWebViewのコンテンツを取得することは不可能であることをインターネット上で知っていたので、WebClientからデータを取得するために私のhttpclientを使用する必要がありました。アンドロイド:Webviewとhttpclientの間でセッションを共有

問題は、このWebサービスがセッションを使用していて、セッションがWebViewにあるため、httpclientにそれがなく、Webサービスのコンテンツにアクセスできません。

この問題に関する多くの記事がありますが、解決策を理解できませんでした。ここで

は私が私の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

WebScarabまたはFiddlerのようなプロキシを介してトラフィックをルーティングし、WebViewとhttpclientの要求の相違点を特定します。 – Robert

答えて

10

このtutoフォロー:

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

を====================== =========ここにウェブページの内容=====

あなたがAndroidでやっているかもしれないことは、Web認証です。 ほとんどのWebサイトはセッションIDを追跡し、ログインしたままにするためにCookieを発行します。この認証を維持するには、アクティビティ間で、またHTTPクライアントとWebview間でCookieを同期させておく必要があります。

私がやったやり方は、アプリケーションを拡張したクラスを作成してから、アプリケーションの残りの部分で使用する単一のHttpClientを定義することでした。このコードは次のようになります。

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

このクラスはまたAsyncTasksに適しており、複数の同時http要求を行っているのHttpClientを作成します。 ClientConnectionManagerにThreadSafeClientConnManagerを使用すると、バックボタンを押して2番目または3番目に開始するときに強制的に閉じることなく、AsyncTasks内でhttpリクエストを実行します。

また、すべてのアクティビティでアクセスできる単一のデフォルトのCookieストアも作成されます。 getClient()メソッドを呼び出すことによって、他のアクティビティでこれを使用します。例

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

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

については

あなたはそれが必要なのWebViewを使用して、クライアントと同じクッキーにアクセスして使用するためにそれを必要とする見つけた場合。 (onPageStarted方法で)あなたが正しいドメインでexample.comを切り替える必要があります

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

:あなたはCookieManagerを使用して、クライアントのCookieストアを同期することができます。

+0

リンクが壊れています – Skynet

15

だから、これは私がやったことであり、それは私のために働いた -
方法は、アプリケーションCookieManagerから、指定されたURLのクッキーを取得します -

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

今すぐgetCookieFromAppCookieManagerためimplmentationは次のとおりです。アプリケーションCookieManagerは、アプリケーションのWebViewインスタンスによって使用されるCookieを管理します。

@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)を使用してwebview Cookieを共有することが必要な場合はうまく動作します – 2cupsOfTech

関連する問題