Java HttpClient未保持登录状态
我尝试在使用HttpClient登录后浏览网站 我首先定义一个HttpClient实例和一个cookie存储:Java HttpClient未保持登录状态,java,android,web-scraping,httpclient,Java,Android,Web Scraping,Httpclient,我尝试在使用HttpClient登录后浏览网站 我首先定义一个HttpClient实例和一个cookie存储: public HttpClient httpclient = new DefaultHttpClient(); public CookieStore cookieStore = new BasicCookieStore(); public HttpContext localContext = new BasicHttpContext(); localContext.setAttribu
public HttpClient httpclient = new DefaultHttpClient();
public CookieStore cookieStore = new BasicCookieStore();
public HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
在一个(android)背景任务中,我成功登录了该网站
HttpPost httppost = new HttpPost("http://www.deeproute.com/deeproute/default.asp");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("cookieexists","false"));
nameValuePairs.add(new BasicNameValuePair("name", mUser));
nameValuePairs.add(new BasicNameValuePair("password", mPassword));
nameValuePairs.add(new BasicNameValuePair("subbera", "Login"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
res = httpclient.execute(httppost, localContext);
但是,当我连接到此页面时,我将不再登录。我看了一下,成功登录后的cookies仍然在,所以我不知所措
编辑:作为记录,本网站在普通浏览器中完全正常运行
编辑2:根据Aaron下面的回答,cookies似乎正在保存,因为如果在第一次请求后,我会这样做:
List<Cookie> cookies = cookieStore.getCookies();
int cookieSize = cookies.size();
for (int i = 0; i < cookieSize; i++) {
Log.v(TAG, "Cookie " + i + "name: "
+ cookies.get(i).getName());
Log.v(TAG, "Cookie " + i + "value: "
+ cookies.get(i).getValue());
}
在第二个请求之后,我有两个会话ID cookie:
name: ASPSESSIONIDSCSCSBCS
value: GBAJALJBOGKBFLAELPNKEDOE
name: ASPSESSIONIDSCSCSBCS
value: MBAJALJBDBOKPEHNCDDFOCBC
看起来不像您在初始请求中保存的cookies,因此在下一个请求中没有任何内容可以告诉站点您已登录。
你需要一个饼干容器。谷歌搜索。我遇到了同样的问题。我实现了cookies,但是它仍然没有保持登录状态。我终于让它工作了,所以我发布这段代码希望能帮助其他人解决同样的问题 以下是Apache中关于如何登录和检索所有cookie的示例: 您还可以在此处查看Apache关于“HTTP状态管理”的HttpClient文档: 以下是我的登录功能的实现方式:
CredentialsProvider设置代理
BasicCookieStore
CloseableHttpClient
/login.html
发送请求以登录/user
的GET请求,查看我们是否正确登录//////// SETUP
//Setup Proxy (If needed)
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope("proxy.mycompany", 8080),
new UsernamePasswordCredentials("my_username", "my_password"));
//Setup Cookies
BasicCookieStore cookieStore = new BasicCookieStore();
//Build HttpClient
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.setDefaultCookieStore(cookieStore)
.build();
HttpHost target = new HttpHost("www.mycompany.com", 80, "http");
HttpHost proxy = new HttpHost("proxy.mycompany", 8080);
RequestConfig config = RequestConfig.custom()
.setProxy(proxy)
.build();
try {
//////// LOGIN REQUEST, POST TO /login.html
//Start POST Request
HttpPost httppost = new HttpPost('/login.html');
//Add parameters to POST Request
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair('username','my_username'));
nameValuePairs.add(new BasicNameValuePair('password','my_password'));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
//Set Config for POST Request
httppost.setConfig(config);
//Execute POST Request
httpresponse = httpclient.execute(target, httppost);
//Print Response Code
try {
System.out.println("Status Code: "+httpresponse.getStatusLine().getStatusCode());
} finally {
//Close HTTP Reponse (must be in a 'finally' block)
httpresponse.close();
}
//////// CHECK LOGIN STATUS, GET TO /user
//Start GET Request
HttpGet httpget = new HttpGet('/user');
//Set Config for GET Request
httpget.setConfig(config);
//Execute GET Request
httpresponse = httpclient.execute(target, httpget);
//Print Response Code
try {
System.out.println("Status Code: "+httpresponse.getStatusLine().getStatusCode());
} finally {
//Close HTTP Reponse (must be in a 'finally' block)
httpresponse.close();
}
} finally {
httpclient.close();
}
///SETUP
//安装代理(如果需要)
CredentialsProvider credsProvider=新的BasicCredentialsProvider();
credsProvider.setCredentials(
新AuthScope(“proxy.mycompany”,8080),
新用户名密码凭据(“我的用户名”、“我的密码”);
//设置Cookies
BasicCookieStore cookieStore=新BasicCookieStore();
//构建HttpClient
CloseableHttpClient httpclient=HttpClients.custom()
.setDefaultCredentialsProvider(CredProvider)
.setDefaultCookieStore(cookieStore)
.build();
HttpHost target=新的HttpHost(“www.mycompany.com”,80,“http”);
HttpHost proxy=新的HttpHost(“proxy.mycompany”,8080);
RequestConfig=RequestConfig.custom()
.setProxy(代理)
.build();
试一试{
////////登录请求,发布到/LOGIN.html
//启动POST请求
HttpPost-HttpPost=newhttppost('/login.html');
//向POST请求添加参数
List nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair('username','my_username');
添加(新的BasicNameValuePair('password','my_password');
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
//设置POST请求的配置
httppost.setConfig(config);
//执行POST请求
httpresponse=httpclient.execute(目标,httppost);
//打印响应代码
试一试{
System.out.println(“状态代码:+httpresponse.getStatusLine().getStatusCode());
}最后{
//关闭HTTP响应(必须在“finally”块中)
httpresponse.close();
}
////////检查登录状态,转到/user
//开始获取请求
HttpGet-HttpGet=newhttpget('/user');
//设置GET请求的配置
httpget.setConfig(config);
//执行GET请求
httpresponse=httpclient.execute(目标,httpget);
//打印响应代码
试一试{
System.out.println(“状态代码:+httpresponse.getStatusLine().getStatusCode());
}最后{
//关闭HTTP响应(必须在“finally”块中)
httpresponse.close();
}
}最后{
httpclient.close();
}
谢谢你的回答,但是我认为cookie正在保存,因为如果我打印cookie列表的元素,我确实看到了值。我还在谷歌上搜索了cookie容器,但我唯一能找到的是CookieManager,它似乎只适用于Android网络视图?
name: ASPSESSIONIDSCSCSBCS
value: GBAJALJBOGKBFLAELPNKEDOE
name: ASPSESSIONIDSCSCSBCS
value: MBAJALJBDBOKPEHNCDDFOCBC
//////// SETUP
//Setup Proxy (If needed)
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope("proxy.mycompany", 8080),
new UsernamePasswordCredentials("my_username", "my_password"));
//Setup Cookies
BasicCookieStore cookieStore = new BasicCookieStore();
//Build HttpClient
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.setDefaultCookieStore(cookieStore)
.build();
HttpHost target = new HttpHost("www.mycompany.com", 80, "http");
HttpHost proxy = new HttpHost("proxy.mycompany", 8080);
RequestConfig config = RequestConfig.custom()
.setProxy(proxy)
.build();
try {
//////// LOGIN REQUEST, POST TO /login.html
//Start POST Request
HttpPost httppost = new HttpPost('/login.html');
//Add parameters to POST Request
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair('username','my_username'));
nameValuePairs.add(new BasicNameValuePair('password','my_password'));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
//Set Config for POST Request
httppost.setConfig(config);
//Execute POST Request
httpresponse = httpclient.execute(target, httppost);
//Print Response Code
try {
System.out.println("Status Code: "+httpresponse.getStatusLine().getStatusCode());
} finally {
//Close HTTP Reponse (must be in a 'finally' block)
httpresponse.close();
}
//////// CHECK LOGIN STATUS, GET TO /user
//Start GET Request
HttpGet httpget = new HttpGet('/user');
//Set Config for GET Request
httpget.setConfig(config);
//Execute GET Request
httpresponse = httpclient.execute(target, httpget);
//Print Response Code
try {
System.out.println("Status Code: "+httpresponse.getStatusLine().getStatusCode());
} finally {
//Close HTTP Reponse (must be in a 'finally' block)
httpresponse.close();
}
} finally {
httpclient.close();
}