`
j夫子
  • 浏览: 92590 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

httpclient4初探_完成有验证码的注册

    博客分类:
  • java
 
阅读更多

我们知道,网站走的是http/https等协议,通过这些协议,我们能在浏览器中完成网站的注册,登录,发表文章,上传文件等一系列操作。呵呵,讲到用浏览器,意味着我们必须用我们的鼠标,键盘进行操作,如果是你要进行大量的重复性操作的话,是不是就略显疲惫了?比如你要反复的登录,然后去给某人投票?本人以前就在寝室反复地从excel里面复制用户名密码登录,投票,注销,为一个学姐刷票...刷抽筋了。
现在通过httpclient这个apache common这个第三方api,就可以很轻松地把这些工作都交给程序来做。

我这里演示的是注册一个验证码的博客,简单地介绍下httpclient4的使用。
ps.博客是我以前做的,基于jsp/servlet

 

1.首页


 

2.查看该页面的源代码 这里只看form表单

 

<form name="reg" action="regist.do" method="post" onSubmit="return checkdata()">
        <center>
                <table width=600 border=0>
                <tr><td>
                用户名</td>
 <td width=60><input type="text" name="username" onBlur="checkUsername()"></td><td width=400><font color=red>*<button onclick="checkUser()">检测用户名</button><span id="usernameE"></span></font></td>
			</tr>
			<tr><td>
			 密码 </td>
		        <td width=60><input type="password" name="password" onBlur="checkPassword()"></td><td width=300><font color=red>*<span id="passwordE"></span></font></p></td></tr>
		    <tr><td>
			 重复密码 </td>
		     <td width=60> <input type="password" name="repassword" onBlur="checkRePassword()" ></td><td width=300><font color=red>*<span id="repasswordE"></span></font></p></td></tr>
			 <tr><td>
			姓名</td>
			 <td width=60>  <input type="text" name="name" onBlur="checkRealName()"></td><td width=300><font color=red>*<span id="nameE"></span></font></p></td></tr>
			<tr><td>
			性别		</td>
			<td width=200> 
			  <label>
			  <input type="radio" name="sex" value="0" >
男</label>
			  <label>
			  	<input type="radio" name="sex" value="1">

女</label>

			  <label>

			  <input type="radio" name="sex" value="2" checked="checked">

不详</label></td> </tr>

			<tr><td>

			邮箱</td>

			   <td width=60> <input type="text" name="email" onblur="checkMail()"></td><td width=300><font color=red>*<span id="mailE"></span></font></p></td></tr>

			<tr><td>

			   验证码</td><td width=60><input type="text" name="ccode" onblur="checkCode()"/></td>

			<td width=300> <img id="code" src="Checkcode?"+1335096054921 />

	[url=javascript:;]看不清,换一个[/url]</p></td></tr>

			  <tr><td>

			    <input type="submit" name="submit" value="提交">

			    </label>	

			    <label>

			    <input name="reset" type="reset" id="reset" value="重置">

			    </label>

			    </td></tr>

			    </table>

			    </center>

			  </form>
 
3.这个表单是要提交到 regist.do 这个servlet,提交的信息有如下属性

username------用户名
password------密码
name------姓名
sex------性别
email------邮箱
ccode------验证码

需要注意的是:
验证码</td><td width=60><input type="text" name="ccode" onblur="checkCode()"/></td>

<td width=300> <img id="code" src="Checkcode?"+1335096054921 />
<img>连接的是一个servlet:Checkcode,后面跟的是随机数,防止得到缓存数据

知道了如上信息后,我们就可以开始编写程序了。
首先创建一个java project
导入httpclient所需要的Jar包 我这里用的是最新版
下载地址 http://hc.apache.org/downloads.cgi


4.代码
public class FormDemo {
	public static void main(String[] args) throws ClientProtocolException,
			IOException {
		DefaultHttpClient httpclient = new DefaultHttpClient();
		//登录和发表文章先不做讨论
//		login(httpclient);
//		postArticle(httpclient);
                //注册
		regist(httpclient);
                //关闭Httpclient
		httpclient.getConnectionManager().shutdown();

	}
	/**
	 * 注册
	 * @param httpclient
	 * @throws IOException 
	 * @throws ClientProtocolException 
	 */
	private static void regist(DefaultHttpClient httpclient) throws ClientProtocolException, IOException {
		/**
		 * 下载验证码
		 */
                //验证码生成的大概原理就是随即生成一个验证码字符串(0-9,a-z),然
                //后用io流和图片流将验证码写入图片中,最后将图片用servlet writer出                                                                                                                                     
                  //通过get方式访问该servlet,得到验证码图片		
HttpGet httpget = new HttpGet("http://localhost:8080/blog/Checkcode?"+new Random().nextInt(1000));
                 //执行get请求
		HttpResponse response =  httpclient.execute(httpget);
                //我们把返回的信息,保存在本地的一张图片里
		File file = new File("regist.jpg");
		OutputStream ops = new FileOutputStream(file);
		response.getEntity().writeTo(ops);
		ops.close();
		/**
		 * 这时我们可以弹出一个JFrame来显示刚刚保存的验证码,我现在做的是                   验证码手动输入,当然还可以做程序来读验证码。
		 */
		JFrame frame= new JFrame();
		frame.setVisible(false);
		frame.setBounds(100, 100, 100, 100);
		frame.setLayout(new FlowLayout());
		ImageIcon icon  = new ImageIcon("regist.jpg");
		frame.add(new JLabel(icon));
		frame.setVisible(true);
		
		/**
		 * 在控制台输入验证码
		 */
		System.out.println("输入你看到的验证码");
		Scanner scr = new Scanner(System.in);
		String code = scr.nextLine();
		
		EntityUtils.consume(response.getEntity());
		//提交注册请求到regist.do,并以post方式提交一个表单,就是刚刚我们看到的注册信息
		HttpPost post = new HttpPost("http://localhost:8080/blog/regist.do");
		List<NameValuePair> nvps = new ArrayList<NameValuePair>();
		nvps.add(new BasicNameValuePair("username", "ydxx1"));
		nvps.add(new BasicNameValuePair("password", "zhao1"));
		nvps.add(new BasicNameValuePair("repassword", "zhao1"));
		nvps.add(new BasicNameValuePair("name", "zhao12"));
		nvps.add(new BasicNameValuePair("sex", "1"));
		nvps.add(new BasicNameValuePair("email", "dsfsd@126.com"));
                //把控制台输入的验证码填入
		nvps.add(new BasicNameValuePair("ccode", code));
		post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
		
		response = httpclient.execute(post);
		System.out.println(response.getStatusLine());
		EntityUtils.consume(response.getEntity());
	}
}
 


5.效果



这里我们就看到了刚通过程序注册的用户


需要注意的是,在程序中必须保证是同一个HttpClient对象,因为它里面保存了jsessionid,而验证码也是保存在session里的,如果是不同的httpclient对象,那你得到的验证码和现在服务端所生成的验证码并不是同一个,就不能注册成功了。

忘记截图了,这张是后来截的
弹出的jframe

 

  • 大小: 158.5 KB
  • 大小: 10.9 KB
  • 大小: 2 KB
  • 大小: 5.5 KB
  • 大小: 2 KB
  • 大小: 2.5 KB
1
0
分享到:
评论
1 楼 liutao1600 2013-05-12  
太好了~~~~~

相关推荐

    HTTPClient_delphi_delphi7_ssl_

    4. HTTPClient.cfg - 配置文件,可能包含了HTTPClient库的设置,如代理服务器、连接超时等。 5. HTTPClient.conf - 另一个配置文件,可能存储了SSL证书、密钥和其他连接参数。 6. history.dat - 可能是保存用户历史...

    HttpClient_canalvwb_qthttpserver_levell6x_use_httpclient_

    在"HttpClient_canalvwb_qthttpserver_levell6x_use_httpclient_"这个标题中,我们可以推断这是一个关于如何在QT服务器(QTHttpServer)上使用HttpClient进行通信的示例。"canalvwb"可能是项目或团队名,而"levell6x...

    PB_Json_httpclient_crypto_ftp_20210125.rar

    在PB环境中,可能有集成的HttpClient组件或类库,用于实现PB应用与Web服务器的通信,如发送GET、POST请求等。 4. **Crypto**:这通常指的是加密技术。在PB应用中,可能涉及到数据的安全传输和存储,比如使用SSL/TLS...

    HttpClient.zip_HTTP_c++ httpclass_c++ httpclient类_http client c+

    可能有一个`parseResponse()`函数来完成这个任务。 5. **错误处理**:当请求失败或发生异常时,HttpClient应能提供错误信息。这可能通过异常机制或者返回错误代码实现。 6. **连接管理**:为了提高效率,...

    Android-Httpclient_Get_Post

    参数通常附加在URL后面,请求的数据对所有人可见,且有长度限制。GET请求是幂等的,即多次执行同一个GET请求,服务器结果应该保持不变。 2. **POST**:用于向服务器发送数据,常用于提交表单或者上传文件。数据被...

    使用_HttpClient_和_HtmlParser_实现简易爬虫

    HttpClient 和 HtmlParser 是两个在Java开发中用于网络通信和网页解析的重要开源库。HttpClient 主要负责处理HTTP协议的网络请求,如GET和POST,而HtmlParser则用于解析HTML文档,提取所需信息。以下是对这两个库的...

    HttpClient4_Tutorial_API_Doc_En+Cn.rar

    《HttpClient4教程与API文档详解》 HttpClient是Apache软件基金会的一个开源项目,主要提供了一组与HTTP协议交互的客户端编程工具类,广泛应用于各种网络应用的开发中。HttpClient4.0.3是HttpClient的一个重要版本...

    httpclient_cache_4.5.0.jar.7z

    2. **初始化HttpClient**:创建一个`BasicHttpParams`实例,设置缓存大小和缓存目录,然后将其传递给`DefaultHttpClient`构造函数。例如: ```java HttpParams params = new BasicHttpParams(); ...

    java爬虫所需的httpclient.rar_java HTTPCLIENT包

    在Java编程中,HttpClient常被用于网页爬虫的开发,因为它提供了对网络通信的低级别控制,使我们能够灵活地处理各种网络任务。 在使用Java HttpClient进行网页抓取时,首先需要理解以下关键概念和组件: 1. **...

    httpClient连接https 获得验证码图片示例

    httpClient连接https 获得验证码图片示例 需要证书才能连接的那种 /* 本文所用开发工具 jak1.5.0_06 eclipse:ObjectWeb Lomboz lib: commons-codec-1.4.jar commons-logging-1.1.jar httpclient-4.0.3.jar ...

    9-HTTP_Client.rar_9-HTTP_Client_C http_STM32 HTTPClient_client_h

    STM3210X HTTP_Client

    httpclient4_中文版帮助文档

    httpclient4_中文版帮助文档,计算机网络基础入门必读,软件测试必读

    httpclient4_5和httpcore4_5

    标题中的"httpclient4_5和httpcore4_5"指的是HttpClient 4.5.13版本和HttpCore 4.4.15版本,这两个都是针对HTTP协议的组件,分别提供了不同层次的服务。HttpClient是较上层的接口,提供了完整的HTTP客户端功能,包括...

    httpclient4_中文版帮助文档.

    【HttpClient 概述】 HttpClient 是一个 Java 开源库,用于执行客户端 HTTP 通信。它旨在弥补 Java 核心包 `java.net` 在处理 HTTP 请求时的不足,提供更灵活、功能丰富的工具,以支持最新的 HTTP 标准和建议。...

    httpclient4_中文版帮助文档.pdf

    httpclient4_中文版帮助文档.pdf

    BonusFaresClient_java_httpclient_Sold!_toplza_API_

    【标题】"BonusFaresClient_java_httpclient_Sold!_toplza_API_" 指的是一款基于Java编写的客户端应用程序,其主要功能是搜索Transaero航空公司的里程兑换机票。"Sold!"可能表示该应用专注于处理已售出的或者用里程...

    HttpClient 3.x to HttpComponents HttpClient 4.x

    在HttpClient 3.x中,可以设置代理认证、状态管理和连接管理等操作,这些操作在4.x版本中有新的实现方式。程序员需要掌握如何使用`Credentials`和`AuthScope`来处理认证,以及如何配置代理服务器。 此外,迁移指南...

    HttpServer.zip_http servlet server_httpclient_http服务器_java https

    1. HttpClient使用:创建HttpClient实例,配置请求参数,然后通过execute方法发送请求,获取响应。它可以方便地处理各种复杂的HTTP请求场景。 2. 请求与响应处理:HttpClient允许开发者精细控制请求头、请求体、...

Global site tag (gtag.js) - Google Analytics