android 用httpclient登录无法保持会话状态 最后两次请求的cookie都不一样!我明明设成一样了?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 用httpclient登录无法保持会话状态 最后两次请求的cookie都不一样!我明明设成一样了?相关的知识,希望对你有一定的参考价值。
HttpPost loginRequest = new HttpPost(postUrl);
// 取得HttpClient对象
HttpClient httpclient = new DefaultHttpClient();
// 设置Http Post请求参数必须用NameValuePair对象
List<NameValuePair> params = new ArrayList<NameValuePair>();
NameValuePair number = new BasicNameValuePair("number", userName);
NameValuePair passwd = new BasicNameValuePair("passwd", passWord);
NameValuePair returnUrl = new BasicNameValuePair("returnUrl", "");
NameValuePair select = new BasicNameValuePair("select", "cert_no");
params.add(number);
params.add(passwd);
params.add(returnUrl);
params.add(select);
loginRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
HttpResponse loginResponse = httpclient.execute(loginRequest);
String sessionId = "";
loginResult = EntityUtils.toString(loginResponse.getEntity(),
"utf-8");
List<Cookie> cookie = ((AbstractHttpClient) httpclient)
.getCookieStore().getCookies();
for (int i = 0; i < cookie.size(); i++)
sessionId = cookie.get(i).getValue();
//此时我们登陆成功,并且拿到了cookie
//然后再进行GET方法跳转到下以页面
HttpClient http = new DefaultHttpClient();
HttpGet httppost = new HttpGet(url2);
Httppost.addHeader("Cookie", sessionId);
HttpResponse httpresponse = http.execute(httppost);
List<Cookie> cookie2 = ((AbstractHttpClient) http).getCookieStore()
.getCookies();
String sessionId2 = "";
System.out.println(cookie2.size());
for (int i = 0; i < cookie2.size(); i++)
sessionId2 = cookie2.get(i).getValue();
System.out.println(sessionId2);
String res2 = EntityUtils.toString(httpresponse.getEntity(),
"utf-8");
System.out.println(res2);
得判断是否真成功了。 另外服务器送来的cookie是否一样,那要看服务器送什么回来。现在这样单方面调试,很费劲的 参考技术A HttpClient http = new DefaultHttpClient();
new一下就行了,不要多次new。
楼主,你怎样保存回话session啊,让时间长点,好在登录完成后做其他 事情呢 参考技术B 楼主解决了吗?看到请回答啊。 参考技术C 可能没保存
连接保持活动在某些主机上无法与 System.Net.Http.HttpClient 一起使用
【中文标题】连接保持活动在某些主机上无法与 System.Net.Http.HttpClient 一起使用【英文标题】:Connection keep-alive not working with System.Net.Http.HttpClient on certain hosts 【发布时间】:2013-07-27 05:52:30 【问题描述】:我正在使用 .NET System.Net.Http.HttpClient
试验 Heroku API。特别是,我希望keep-alive
能够工作,这样我就可以使用一个 TCP 连接发送多个 HTTP 请求,并且只进行一次 SSL 握手,而不是为每个请求设置一个带有 SSL 握手的 TCP 连接。
我正在测试https://api.heroku.com/status,它提供了一个不错的 HTTP 200,并使用 Wireshark 来监控 TCP 流量。
Google Chrome、ApacheBench(带有-k
标志)和 curl 似乎都能够保持 TCP 连接打开并发送多个请求。 HttpClient,没那么多。我还针对其他主机测试了 HttpClient(例如https://google.com/,在那里我只看到一个 SSL 握手/TCP 设置。所以看起来 HttpClient 和 Heroku API 之间的交互很糟糕。
这是我正在测试的代码:
private static async void TestUrl(string url)
using (var client = GetClient())
await client.GetAsync(url);
await client.GetAsync(url);
await client.GetAsync(url);
await client.GetAsync(url);
private static HttpClient GetClient()
var requestHandler = new HttpClientHandler
UseCookies = false,
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip,
;
return new HttpClient(requestHandler);
我还附上了一个 Wireshark 屏幕截图,显示了 HttpClient 在完成接收数据后如何决定重置 (RST
) 连接。
对这里发生的事情有什么建议吗?
【问题讨论】:
Fiddler 显示了什么?如果他们协商 HTTP 1.0,那么您需要一个明确的 Keep-Alive 标头。 @StephenCleary Google Chrome 显示 HTTP/1.1 我的意思是在HttpClient
和 Heroku 之间。
@StephenCleary 在调试和检查东西时,我从 HttpClient 中得到的 HttpResponseMessage 显示 Version: 1.1
,所以我假设没问题。我还用 Fiddler2 进行了测试——它是 HTTP 1.1,Connection: keep-alive
发送正常。
【参考方案1】:
使用 WebRequestHandler 类而不是 HttpClientHandler 并将属性 HttpWebRequest.UnsafeAuthenticatedConnectionSharing 设置为 True。
【讨论】:
【参考方案2】:一些代理服务器在进行身份验证时会忽略保持活动状态。如果我没记错的话,那是代理服务器使用 NTLM 身份验证的时候。
过去,我不得不添加一个部分类来“帮助”一些 Web 服务代理类。
我用
覆盖了 GetWebRequest(Uri uri) 方法System.Net.HttpWebRequest webRequest =
(System.Net.HttpWebRequest)base.GetWebRequest(uri);
webRequest.ProtocolVersion = HttpVersion.Veraion10; // I know this is strange, but it works
webRequest.ServicePoint.Expect100Continue = false; // This is where the magic lives
return webRequest;
【讨论】:
以上是关于android 用httpclient登录无法保持会话状态 最后两次请求的cookie都不一样!我明明设成一样了?的主要内容,如果未能解决你的问题,请参考以下文章
客户端怎么使用httpclient向https服务器发送数据
httpclient (phpmyadmin) 无法在 Android 4.0+ 上运行
连接保持活动在某些主机上无法与 System.Net.Http.HttpClient 一起使用