运用Java进行Http表单数据自动提交

统一的URL编码

package demo0808.demo2;
/**
 * 由于网络上HTTP的POST请求需要进行编码
 * 以此来适应不同的操作系统
 * 编码成统一的ASCII字符
 * 本类对Query语句进行URL编码
 * 键值对中间用=连接
 * 不同的键值对用&连接
 */
import java.net.URLEncoder;

public class QueryString {
private StringBuilder query=new StringBuilder();
private String charset="UTF-8";
	/**
	 * 无参默认构造函数
	 */
	public QueryString() {
	}
	/**
	 *  同步添加键值对
	 * @param name 参数名称
	 * @param value 参数值
	 */
	public synchronized void add(String name,String value) {
		query.append(‘&‘);
		encode(name,value);
	}
	/**
	 * 同步进行URL编码
	 * @param name 参数名称
	 * @param value 参数值
	 */
	private synchronized void encode(String name,String value) {
		try {
			query.append(URLEncoder.encode(name, charset));
			query.append(‘=‘);
			query.append(URLEncoder.encode(value,charset));
		} catch (Exception ex) {
			System.err.println("Bad VM can‘t support "+charset);
		}
	}
	/**
	 * 同步获取查询字符串
	 * @return 字符串
	 */
	public synchronized String getQuery() {
		return query.toString();
	}
	/**
	 * 覆盖toString()方法
	 */
	public String toString() {
		return getQuery();
	}
}

基于Http的post请求键值对填写

package demo0808.demo2;
/**
 * 针对HTTP协议的POST请求
 * 表单自动填写
 * 不考虑验证码识别
 * 不考虑https类型的协议
 */
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;

public class FormPoster {
	private URL url;
	private QueryString queryString=new QueryString() ;
	/**
	 * 构造函数
	 * @param url 统一资源位置符号
	 */
	public FormPoster(URL url) {
		if(!url.getProtocol().toLowerCase().startsWith("http")) {
			System.err.println("Post只用于http协议!");
			return;
		}
		this.url=url;
	}
	/**
	 *  添加参数-值对
	 * @param name 参数名称
	 * @param value 参数值
	 */
	public void add(String name,String value) {
		queryString.add(name, value);
	}

	/**
	 * 获取URL
	 * @return URL
	 */
	public URL getURL() {
		return url;
	}
	/**
	 *  获取网站相应的输入流
	 * @return 输入流
	 * @throws Exception 无法连接异常
	 */
	public InputStream post() throws Exception {
		URLConnection openConnection = url.openConnection();
		openConnection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
		openConnection.setDoOutput(true);
		OutputStream outputStream = openConnection.getOutputStream();
		OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"UTF-8");
		outputStreamWriter.write(queryString.toString());
		outputStreamWriter.write("\r\n");
		outputStreamWriter.flush();
		outputStreamWriter.close(); //刷新关闭流很重要,只有关闭了,才能获取输入流
		return openConnection.getInputStream();
	}
}

测试代码

package demo0808.demo2;
/**
 * 测试代码
 */
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;

public class Test {

	public static void main(String[] args) throws Exception {
		URL url = new URL("https://uniportal.huawei.com/uniportal/login.do");
		FormPoster formPoster = new FormPoster(url);
		/**
		 * 以下是测试华为招聘网站登陆界面
		 */
		formPoster.add("actionFlag", "loginAuthenticate");
		formPoster.add("lang", "zh");
		formPoster.add("redirect", "http://career.huawei.com/recruitment/login_index.html?redirect=http://career.huawei.com/recruitment/");
		formPoster.add("uid", "用户名");
		formPoster.add("password", "密码`");
		InputStream inputStream = formPoster.post();
		InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
		File file=new File("outfile");
		FileOutputStream fileOutputStream = new FileOutputStream(file);
		OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,"UTF-8");
		int c;
		while((c=inputStreamReader.read())!=-1) {
			System.out.print((char)c);
			outputStreamWriter.write((char)c);
		}
		inputStream.close();
		outputStreamWriter.close();
		System.out.println();
	}
}
时间: 2024-10-23 06:13:10

运用Java进行Http表单数据自动提交的相关文章

利用JS实现表单的自动提交

今天需要将一个chat整合到客户的网站上去,实现网站的注册用户登录本网站之后点击某个链接能够直接登录到chat上去.我保留了chat原有的登录界面,采用JS技术当页面跳转过来的时候自动填充表单,并自动提交表单,从而实现网站用户无需再次登录即可进入chat.具体代码实现如下 JS代码 <script> //取得cookie值 function getCookie(name){ var arr,reg=new RegExp("(^| )"+name+"=([^;]*)

java 传入用户名和密码并自动提交表单实现登录到其他系统

不用单点登录,模拟远程项目的登录页面表单,在访问这个页面的时候自动提交表单到此项目的登录action,就可以实现登录到其他系统. ssh框架项目 1.以下是本地系统的action代码: 1 import java.io.IOException; 2 import java.util.List; 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 i

防止JSP表单数据重复提交

结合各种搜索资料,采用了两个方法一.前台验证1.首先在from表单加一个隐藏域字段,设值为true.例如: <input type="hideen" name="tokenFlag" id="tokenFlag" value="true"/>2.在js中表单提交的验证方法中加判断,如下: var flag=$("#tokenFlag").val(); if(flag=="true&qu

from 表单回车自动提交

自动提交的情况 1 表单只有单个输入框 2 type='submit  这里注意button默认type为submit 解决方法 1 添加一个隐藏的输入框 2 form添加属性 onsubmit="return false;" <form> <input type="text" name=""> <input type="hidden" name=""> </for

表单数据批量提交,后台批量接收并保存

前台JS代码 1 $("#btn_save").click(function (data) { 2 var values = $("#from_jbxx").serializeArray(); 3 var strdata = {}; 4 $.each($("#from_jbxx").serializeArray(), function (a, b) { strdata[b.name] = b.value; }); 5 if ($("#f

基于表单数据的封装,泛型,反射以及使用BeanUtils进行处理

在Java Web开发过程中,会遇到很多的表单数据的提交和对表单数据的处理.而每次都需要对这些数据的字段进行一个一个的处理就显得尤为繁琐,在Java语言中,面向对象的存在目的便是为了消除重复代码,减少我们程序员的负担.因此,在这里和大家分享一下我学到的一个小技巧. 对于封装 这里说的"封装",是指将从客户端提交的表单数据封装到一个bean层entitry中.这样可以方便对数据的处理.下面就来看一个具体的bean实例化的小例子吧. 比如说我们从网页上获得用户的登录信息,一般来说是用户名和

SpringMVC 接收表单数据、数据绑定

接收表单数据有3种方式. 1.使用简单类型接收表单数据(绑定简单数据类型) 表单: <form action="${pageContext.request.contextPath}/userController/handler" method="post"> 用户名:<input name="username" type="text" /><br /> 密码:<input name=&

按Enter键后Form表单自动提交的问题

怪事年年有,今年特别多. 话说,最近项目中遇到一件怪事,当我鼠标focus在文本框中,轻轻敲了下回车键,尼玛页面突然刷新了,当时把宝宝给吓得. 接下来就是一番苦逼的烧脑和蛋疼~ 一.被表象所迷惑 突然出现这种情况,脑海中第一反应是,keydown事件是不是出问题了,然后找啊找啊找啊,然后没有然后. 在把input元素上的所有事件移除掉后,我自信的按了一下enter键.艾玛,又刷新了.心里那个苦哎. 二.列出所有可能 一阵捣鼓之后,脑海中列出了所有按下enter键后的改变,url改变,多了一个问号

表单自动提交问题整理

表单自动提交问题 问题描述 二是利用了浏览器的默认行为(至少发现ie是这样的).浏览器在解析网页的时候,有许多默认的行为,例如: * 如果一个页面上有表单和一个提交按钮,那么打开页面时,焦点会自动落在这个提交按钮上面. * 同样如果一个表单中只有一个单行文本输入域(text),那么在这个输入域中按Enter键时,浏览器会自动提交该表单. 我们对于第一种情况一般都知道而且很容易理解,但是对于第二种浏览器的默认行为,可能知道这一点的人就比较少了,下面我具体看一下浏览器(至少ie如此)在表单提交上的默