如何用Java代码模拟一些如百度、QQ之类的网站登录?有两个方式,一是发送模拟请求,二是模拟浏览器操作,而这两种方式恰好在Java有开源实现,在这里介绍一个工具包,它是家喻户晓的HttpClient。
  HttpClient 是 Apache Jakarta Common 下的子项目,至于它是干什么用的呢?简单来说就是:它像浏览器一样支持HTTP协议。既然支持HTTP协议,那意味着浏览器能发送的,它也能发送。我想大家都知道登陆的代码流程,大部分无非就是浏览器端以POST方式提交一个form表单,服务器端收到请求后,判断账户密码做相应处理并且返回结果给浏览器端。但是服务器端并不知道是什么给它发送一个请求,它只针对请求作出相应回应。那么我们就可以利用HttpClient模拟以POST请求方式发送一个表单,不过在这之前,先导入相关的Jar包。
  commons-codec-1.3.jar
  commons-httpclient-3.1.jar
  commons-logging-1.1.1.
  这三个jar是httpclient必须的jar包,当然你的版本号可以是其他的。
  导入完以后,模拟一个HTML表单提交的过程:
  首先要构建一个HttpClient,这个HttpClient就像一个浏览器,可以用来发送请求。

 HttpClient client = new DefaultHttpClient(); //构建一个Client

  假设百度的登陆服务器的地址为http://login.baidu.com/,接下来是构建一个POST请求

 HttpPost post = new HttpPost("http://login.baidu.com/");//构建一个POST请求
//构建表单参数
List<NameValuePair> formParams = new ArrayList<NameValuePair>();
formParams.add(new BasicNameValuePair("username", "yourname"));
formParams.add(new BasicNameValuePair("password", "yourpassword"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");//将表单参数转化为“实体”
post.setEntity(entity);//将“实体“设置到POST请求里

现在有POST请求,有表单,有参数 ,那下一步就是提交请求到服务器了

 HttpResponse response = client.execute(post);//提交POST请求

这样就已经完整的模拟了一个浏览器发送POST请求到服务器。大家注意client.execute()完后,会返回一个HttpResponse.利 用这个HttpResponse,我们可以获取到很多东西,如响应头,响应内容,响应Cookie,状态码,返回的输入流等等。下面代码是打印响应的内 容:

 HttpEntity result = response.getEntity();//拿到返回的HttpResponse的"实体"
String content = EntityUtils.toString(result);;//用httpcore.jar提供的工具类将"实体"转化为字符串打印到控制台
System.out.println(content);

我们可以根据HttpResponse返回的状态码、内容等来判断我们是否已经成功登陆百度:

if(content.contains("登陆成功")){
  System.out.println("登陆成功!!!");
}

附上完整代码以便大家测试:

 try {
  HttpClient client = new DefaultHttpClient(); //构建一个Client
  HttpPost post = new HttpPost("http://login.baidu.com/"); //构建一个POST请求
  //构建表单参数
  List<NameValuePair> formParams = new ArrayList<NameValuePair>();
  formParams.add(new BasicNameValuePair("username", "yourname"));
  formParams.add(new BasicNameValuePair("password", "yourpassword"));
  UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");//将表单参数转化为“实体”
  post.setEntity(entity); //将“实体“设置到POST请求里   HttpResponse response = client.execute(post);//提交POST请求
  HttpEntity result = response.getEntity();//拿到返回的HttpResponse的"实体"
  String content = EntityUtils.toString(result);; //用httpcore.jar提供的工具类将"实体"转化为字符串打印到控制台
  System.out.println(content);
  if(content.contains("登陆成功")){
    System.out.println("登陆成功!!!");
  }
} catch (Exception e) {
  e.printStackTrace();
}

HttpClient可以做的还有很多,这只是初步的一个应用。

原文地址:http://www.cnblogs.com/cha1r/p/3396100.html

最新文章

  1. Unity3D框架插件uFrame实践记录(一)
  2. Fatal signal xx (SIGSEGV) at
  3. Struts2核心技术简介
  4. pysproto bug修复
  5. spring 学习
  6. oracle Redhat64 安装错误3
  7. easyUI之window
  8. unity的坑
  9. 一个SQL 建表格式
  10. 性能测试工具:AB
  11. 有关于web server架构的一个小疑问
  12. IOS 清除UIWebview的缓存以及cookie
  13. windows系统下安装Scala
  14. 浅析Web缓存
  15. 01 JVM 从入门到实战 | 什么是 JVM
  16. Python 自然语言处理(1)中文分词技术
  17. 避免切换横竖屏Fragment的重复加载导致UI混乱
  18. 分析easyswoole3.0源码,consoleTcpService(六)
  19. slecte下拉框的多选操作及获取值的 变化
  20. Python3.5中安装Scrapy包时出现问题

热门文章

  1. Android-setDefaultKeyMode方法
  2. Delphi 操作word 表格
  3. PHP:6种GET和POST请求发送方法
  4. dwr消息推送
  5. Machine Learning &amp; Data Mining 资料整合
  6. CORBA
  7. java StreamTokenizer使用
  8. ZOJ3772 - Calculate the Function(线段树+矩阵)
  9. LUA和C++绑定的一些天然的麻烦
  10. NLog 錯誤小記