Android HttpClient 和 Cookie

Posted

技术标签:

【中文标题】Android HttpClient 和 Cookie【英文标题】:Android HttpClient and Cookies 【发布时间】:2012-12-12 19:26:17 【问题描述】:

android 中的 HttpClient 存在问题:通过使用以下代码,我想通过 webview 登录来使用之前已经设置的 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。

提前感谢您的帮助

你好,提莫

【问题讨论】:

你可以在这里找到你的答案:***.com/questions/4210846/android-httpclient-cookie 不,我不能。这正是我尝试过的。我什至尝试以这种方式设置标题。我唯一没有实现的是实体,因为实际上我没有要发布的数据(cookie 除外)。另一个帖子也没有帮助我:/ "我想使用之前通过webview登录的cookies" -- HttpClient使用的cookies独立于任何WebView使用的cookies,如WebView不使用 HttpClient。 【参考方案1】:

我遇到了同样的问题,我使用了与问题类似的方法,但没有运气。 使它对我有用的是为每个复制的 cookie 添加域。 (BasicClientCookie cookie.setDomain(String))

我的实用功能:

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

【讨论】:

很好,我们花了很长时间才弄明白。 嗨丹尼尔,我有同样的问题,但有点不同,你能帮我看看吗? :) ***.com/q/25204423/3350765【参考方案2】:

如果您仍然有这个问题,请小心给定的 cookie,有些可能格式不正确,请检查这两个站点:

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

这个帮助了我: Getting "Set-Cookie" header

【讨论】:

【参考方案3】:

您似乎正确地复制了 cookie,并且通常您不需要为 HttpClient 执行任何特殊操作来发送 cookie。但是,其中一些可能绑定到会话,并且当您打开与 HttpClient 的新连接时,您会打开一个新会话。服务器可能会忽略与当前会话不匹配的 cookie。如果会话 ID 在 cookie 中并且您能够进入同一个会话,这可能可以工作,但您确实需要确切地知道服务器在做什么。

【讨论】:

我一直认为 SessionID 是保存在 cookie 中的。因为我已经“分析”了特定站点的 cookie,得出的结论是有 3 个 cookie。一个是具有纯度的东西,相当不重要,一个是生成的数字,在会话结束时到期,最后一个,我猜是重要的,也是一个奇怪且人类不可读的文本,但它在 30 后到期天。我认为这是使网站记住登录并在没有登录的情况下启动会话的重要因素。 通常是这样,是的。但它也可能在 HTTP 参数中。你真的需要知道服务器做了什么,如果这不是一个选项,你只需要尝试不同的东西来看看什么是有效的。 所以你的意思是,例如编辑 httpGet 或 httppost 的标题可能会有所帮助,对吧?好的好的非常感谢你,那我有一个新的方法,因为我一直认为我的代码会有问题。 使用某些工具捕获并重放浏览器会话。如果这不起作用,那你就不走运了。如果是这样,请尝试在您的代码中尽可能地模拟它。

以上是关于Android HttpClient 和 Cookie的主要内容,如果未能解决你的问题,请参考以下文章

UE4 Cook On The Fly通过数据线连接Android手机

android和httpClient

ANDROID : 在 Webview 和 httpclient 之间共享会话

android 中HttpClient和URLConnection的区别

Android--httpclient模拟post请求和get请求

Android HttpClient 和 Cookie