7

AndroidのHttpClientに問題があります。次のコードを使用して、Webビューからログインして以前に設定されたCookieを使用したいと思います。したがって、ログインデータはそこにあるはずであり、実際にそこにあります。私はそれをテストしました。しかし、httppostまたはhttpgetでCookieを使用すると、ログインデータは使用されません。しかし、これらのCookieは、実際には、ログインが必要なページを受信するのに十分なはずですよね。特別な方法でCookieをサーバーなどに送信する必要があるのか​​、それともhttpcontextにロードするのに十分なのかはよくわかりません。コードは次のとおりです。

DefaultHttpClient httpclient = new DefaultHttpClient();
CookieStore lCS = new BasicCookieStore();


if (CookieManager.getInstance().getCookie(pUrl) != null) {  
    String cookieString = CookieManager.getInstance().getCookie(pUrl);

    String[] urlCookieArray = cookieString.split(";");
    for (int i = 0; i < urlCookieArray.length; i++) {           
        System.out.println(urlCookieArray[i]);          
        String[] singleCookie = urlCookieArray[i].split("=");
        Cookie urlCookie = new BasicClientCookie(singleCookie[0], singleCookie[1]);
        lCS.addCookie(urlCookie);           
    }

}

HttpContext localContext = new BasicHttpContext();
httpclient.setCookieStore(lCS);
localContext.setAttribute(ClientContext.COOKIE_STORE, lCS);

HttpPost httppost = new HttpPost(pUrl);        


    // get the url connection       
try {

    StringBuilder sb = new StringBuilder();     
    HttpResponse response = httpclient.execute(httppost, localContext);     
    InputStream is = response.getEntity().getContent();         
    InputStreamReader isr = new InputStreamReader(is);          

また、コードを実行すると、そのサイトのログインページしか受け取れないため、Cookieを受け入れませんでした。

事前に助けてくれてありがとう

挨拶、ティモ

4

3 に答える 3

8

私は同じ問題を抱えていて、運が悪かった質問と同じようなアプローチを使用しました。私にとってそれを機能させたのは、コピーされた各Cookieのドメインを追加することでした。(BasicClientCookie cookie.setDomain(String))

私のutil関数:

public static BasicCookieStore getCookieStore(String cookies, String domain) {
    String[] cookieValues = cookies.split(";");
    BasicCookieStore cs = new BasicCookieStore();

    BasicClientCookie cookie;
    for (int i = 0; i < cookieValues.length; i++) {
        String[] split = cookieValues[i].split("=");
        if (split.length == 2)
            cookie = new BasicClientCookie(split[0], split[1]);
        else
            cookie = new BasicClientCookie(split[0], null);

        cookie.setDomain(domain);
        cs.addCookie(cookie);
    }
    return cs;
}

 String cookies = CookieManager.getInstance().getCookie(url);
 BasicCookieStore lCS = getCookieStore(cookies, MyApp.sDomain);

 HttpContext localContext = new BasicHttpContext();
 DefaultHttpClient httpclient = new DefaultHttpClient();
 httpclient.setCookieStore(lCS);
 localContext.setAttribute(ClientContext.COOKIE_STORE, lCS);
 ...
于 2013-04-10T11:46:52.803 に答える
1

それでもこの問題が発生する場合は、特定のCookieに注意してください。一部のCookieは不正な形式である可能性があります。次の2つのサイトを確認してください。

http://www.codeproject.com/Articles/3106/On-The-Care-and-Handling-of-Cookies

これは私を助けました: 「Set-Cookie」ヘッダーを取得する

于 2013-08-03T23:49:12.780 に答える
0

Cookieを正しくコピーしているようです。通常、HttpClientがCookieを送信するために特別なことをする必要はありません。ただし、それらの一部はセッションにバインドされている可能性があり、HttpClientで新しい接続を開くと、新しいセッションが開きます。サーバーは、現在のセッションと一致しないCookieをおそらく無視します。これは、セッションIDがCookieに含まれていて、同じセッションに参加できる場合に機能する可能性がありますが、サーバーが何をするのかを正確に知る必要があります。

于 2012-12-13T03:59:28.553 に答える