使用httpclient模拟登陆操作,出现问题了,求帮助~~

lliu26 2014-03-27 08:41:37
想通过httpclient,做一个通过java代码登陆百度的功能。
参考了网上的多个版本,实现的原理差不多,但是有几个点我还是有点不清楚,比如:
1.如何确定request中需要传递的参数个数和每个参数名
2.第一次打开request,拿到location后,第二次发送请求,如何根据返回的response,判断是否登陆成功呢?(理论上,如果页面上包含我的用户名,应该就是成功了,但是我的返回值跟第一次访问返回的基本是一样的响应)。


麻烦大家帮忙看一下我的代码,要做如何修改?



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

public class BaiduLoginMain {
public static void main(String[] args) {
BaiduLoginUtil.process("username", "xxxxxxx");
}

public static boolean process(String username, String password) {
boolean loginResult = false;

DefaultHttpClient httpclient = new DefaultHttpClient();

HttpResponse response;
HttpEntity entity;

List<Cookie> cookies;

//组建登录的post包
try {
HttpPost httpPost = buildHttpPost(username, password);
response = httpclient.execute(httpPost);

entity = response.getEntity();
System.out.println("Login form get: " + response.getStatusLine());
EntityUtils.consume(entity);

cookies = httpclient.getCookieStore().getCookies();
if (cookies.isEmpty()) {
System.out.println("None");
} else {
for (int i = 0; i < cookies.size(); i++) {
System.out.println("- " + cookies.get(i).toString());
}
}

//进行页面跳转
//这里本来应该获取response中的Location,但是返回结果里面没有这个数据,所以我临时指定了跳转页面地址
String url = "http://www.baidu.com"; // 页面跳转
HttpGet httpget1 = new HttpGet(url);
response = httpclient.execute(httpget1);
// 理论上,这里应该登陆成功了

entity = response.getEntity();
if (entity != null) {
//do something...
}
// 显示结果
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(),
"UTF-8"));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
httpclient.getConnectionManager().shutdown();
}

return loginResult;
}

/**
* 构建request
* @param username
* @param password
*/
private static HttpPost buildHttpPost(String username, String password) {
HttpPost httpPost;
HttpClient httpclient = new DefaultHttpClient();
httpPost = new HttpPost(
"https://passport.baidu.com/v2/?login&tpl=mn&u=http://www.baidu.com/"); // 用户登录
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("TANGRAM__PSP_8__userName", username));
nvps.add(new BasicNameValuePair("TANGRAM__PSP_8__password", password));

httpPost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));

httpPost.addHeader("Cache-control", "no-cache");
httpPost.addHeader("Connection", "keep-alive");
httpPost.addHeader("Content-Encoding", "gzip");
httpPost.addHeader("Content-Language", "zh-CN");
httpPost.addHeader("Content-Type", "text/html;charset=UTF-8");
httpPost.addHeader("Server", "nginx");;

return httpPost;
}
}

...全文
171 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
tony4geek 2014-03-31
  • 打赏
  • 举报
回复
浏览器测试了,很多参数估计。
  • 打赏
  • 举报
回复
需要什么参数要自己看登录页的源代码,参数名要一致。
Defonds 2014-03-31
  • 打赏
  • 举报
回复
针对异常表一点点测试,缺啥参数就加啥

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧