11

私は実際に WebView にセッションを記録しています。しかし、私は httpclient も使用して、Web からデータを送受信します。WebView のコンテンツを取得することは不可能であることをインターネットで見たので、httpclient を使用して Web サービスからデータを取得する必要がありました。

問題は、この 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

次に、この Cookie を 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);
4

2 に答える 2

10

このチュートに従ってください:

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

=============================== ウェブページの内容はこちら =====

Android で行っていることの 1 つに、Web 認証があります。ほとんどの Web サイトは、セッション ID を追跡し、ユーザーのログイン状態を維持するために Cookie を発行します。この認証を維持するには、アクティビティ間、および http クライアントと Web ビュー間で 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);
            ...
        }
        ...
    }

Web ビューを使用する必要があり、クライアントと同じ Cookie にアクセスして使用する必要がある場合。CookieManager を使用して、クライアントの Cookie ストアを同期できます: (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 を正しいドメインに切り替える必要があります。

于 2012-07-02T09:46:16.210 に答える