Java网络技术整理

1.Get方式
这种方式是最简单的参数传递方式。例如: http://www.zlex.org/get.do?a=3&b=5&c=7
这个url中,a、b和c是url参数,具体的说是参数名,与之用“=”隔开的是对应的参数值。也就是说参数a的值为3、参数b的值为5、参数c的值为7。get.do是请求地址,紧跟这个地址的参数a需要用“?”作为分隔符,其余参数用“&”做分隔符。
这种get请求发起后,服务器端可以通过request.getParameter()方法来获得参数值。如要获得参数a的值可以通过request.getParameter("a");
2.Post方式
相比get方式,post方式更为隐蔽。例如: http://www.zlex.org/post.do
在这个url中,你看不到任何参数,真正的参数隐藏在Http请求的数据体中。如果了解网络监听的话,就会对这一点深有体会。
我们举一个简单的例子:通过表单做登录操作。
我们简化一个登录表单:
Html代码 收藏代码
  1. <formaction="login.do"method="post">
  2. <ul>
  3. <li><labelfor="username">用户名</label><inputid="username"
  4. name="username"type="text"/></li>
  5. <li><labelfor="password">密码</label><inputid="password"
  6. type="password"/></li>
  7. <li><label><inputtype="submit"value="登录"/><input
  8. type="reset"value="重置"/></label></li>
  9. </ul>
  10. </form>

表单中有2个字段,用户名(username)和密码(password)
注意form标签中的method参数值是post!
即便是表单,在服务器端仍然可以通过request.getParameter()方法来获得参数值。
Post方式,其实是将表单字段和经过编码的字段值经过组合以数据体的方式做了参数传递。
经过一番阐述,相信大家对两种网络参数传递方式都有所了解了。
Get方式比较简单,通过构建一个简单HttpURLConnection就可以获得,我们暂且不说。
我们主要来描述一下如何通过java代码构建一个表单提交。
仔细研究表单提交时所对应的http数据体,发现其表单字段是以如下方式构建的:
Java代码 收藏代码
  1. arg0=urlencode(value0)&arg1=urlencode(value1)

当然,尤其要注意字段名,参数名只不能使用中文这类字符。
作为表单, Content-Type 也会有所不同,其值为 application/x-www-form-urlencoded 以下做一个代码展示,以后再需要我就不用翻“旧账”了
我常用的网络工具,其功能远不止模拟一个post请求
Java代码 收藏代码
  1. /**
  2. *2008-12-26
  3. */
  4. packageorg.zlex.commons.net;
  5. importjava.io.DataInputStream;
  6. importjava.io.DataOutputStream;
  7. importjava.io.UnsupportedEncodingException;
  8. importjava.net.HttpURLConnection;
  9. importjava.net.URL;
  10. importjava.net.URLDecoder;
  11. importjava.net.URLEncoder;
  12. importjava.util.Map;
  13. importjava.util.Properties;
  14. /**
  15. *网络工具
  16. *
  17. *@author梁栋
  18. *@version1.0
  19. *@since1.0
  20. */
  21. publicabstractclassNetUtils{
  22. publicstaticfinalStringCHARACTER_ENCODING="UTF-8";
  23. publicstaticfinalStringPATH_SIGN="/";
  24. publicstaticfinalStringMETHOD_POST="POST";
  25. publicstaticfinalStringMETHOD_GET="GET";
  26. publicstaticfinalStringCONTENT_TYPE="Content-Type";
  27. /**
  28. *以POST方式向指定地址发送数据包请求,并取得返回的数据包
  29. *
  30. *@paramurlString
  31. *@paramrequestData
  32. *@return返回数据包
  33. *@throwsException
  34. */
  35. publicstaticbyte[]requestPost(StringurlString,byte[]requestData)
  36. throwsException{
  37. PropertiesrequestProperties=newProperties();
  38. requestProperties.setProperty(CONTENT_TYPE,
  39. "application/octet-stream;charset=utf-8");
  40. returnrequestPost(urlString,requestData,requestProperties);
  41. }
  42. /**
  43. *以POST方式向指定地址发送数据包请求,并取得返回的数据包
  44. *
  45. *@paramurlString
  46. *@paramrequestData
  47. *@paramrequestProperties
  48. *@return返回数据包
  49. *@throwsException
  50. */
  51. publicstaticbyte[]requestPost(StringurlString,byte[]requestData,
  52. PropertiesrequestProperties)throwsException{
  53. byte[]responseData=null;
  54. HttpURLConnectioncon=null;
  55. try{
  56. URLurl=newURL(urlString);
  57. con=(HttpURLConnection)url.openConnection();
  58. if((requestProperties!=null)&&(requestProperties.size()>0)){
  59. for(Map.Entry<Object,Object>entry:requestProperties
  60. .entrySet()){
  61. Stringkey=String.valueOf(entry.getKey());
  62. Stringvalue=String.valueOf(entry.getValue());
  63. con.setRequestProperty(key,value);
  64. }
  65. }
  66. con.setRequestMethod(METHOD_POST);//置为POST方法
  67. con.setDoInput(true);//开启输入流
  68. con.setDoOutput(true);//开启输出流
  69. //如果请求数据不为空,输出该数据。
  70. if(requestData!=null){
  71. DataOutputStreamdos=newDataOutputStream(con
  72. .getOutputStream());
  73. dos.write(requestData);
  74. dos.flush();
  75. dos.close();
  76. }
  77. intlength=con.getContentLength();
  78. //如果回复消息长度不为-1,读取该消息。
  79. if(length!=-1){
  80. DataInputStreamdis=newDataInputStream(con.getInputStream());
  81. responseData=newbyte[length];
  82. dis.readFully(responseData);
  83. dis.close();
  84. }
  85. }catch(Exceptione){
  86. throwe;
  87. }finally{
  88. if(con!=null){
  89. con.disconnect();
  90. con=null;
  91. }
  92. }
  93. returnresponseData;
  94. }
  95. /**
  96. *以POST方式向指定地址提交表单<br>
  97. *arg0=urlencode(value0)&arg1=urlencode(value1)
  98. *
  99. *@paramurlString
  100. *@paramformProperties
  101. *@return返回数据包
  102. *@throwsException
  103. */
  104. publicstaticbyte[]requestPostForm(StringurlString,
  105. PropertiesformProperties)throwsException{
  106. PropertiesrequestProperties=newProperties();
  107. requestProperties.setProperty(CONTENT_TYPE,
  108. "application/x-www-form-urlencoded");
  109. returnrequestPostForm(urlString,formProperties,requestProperties);
  110. }
  111. /**
  112. *以POST方式向指定地址提交表单<br>
  113. *arg0=urlencode(value0)&arg1=urlencode(value1)
  114. *
  115. *@paramurlString
  116. *@paramformProperties
  117. *@paramrequestProperties
  118. *@return返回数据包
  119. *@throwsException
  120. */
  121. publicstaticbyte[]requestPostForm(StringurlString,
  122. PropertiesformProperties,PropertiesrequestProperties)
  123. throwsException{
  124. StringBuildersb=newStringBuilder();
  125. if((formProperties!=null)&&(formProperties.size()>0)){
  126. for(Map.Entry<Object,Object>entry:formProperties.entrySet()){
  127. Stringkey=String.valueOf(entry.getKey());
  128. Stringvalue=String.valueOf(entry.getValue());
  129. sb.append(key);
  130. sb.append("=");
  131. sb.append(encode(value));
  132. sb.append("&");
  133. }
  134. }
  135. Stringstr=sb.toString();
  136. str=str.substring(0,(str.length()-1));//截掉末尾字符&
  137. returnrequestPost(urlString,str.getBytes(CHARACTER_ENCODING),
  138. requestProperties);
  139. }
  140. /**
  141. *url解码
  142. *
  143. *@paramstr
  144. *@return解码后的字符串,当异常时返回原始字符串。
  145. */
  146. publicstaticStringdecode(Stringurl){
  147. try{
  148. returnURLDecoder.decode(url,CHARACTER_ENCODING);
  149. }catch(UnsupportedEncodingExceptionex){
  150. returnurl;
  151. }
  152. }
  153. /**
  154. *url编码
  155. *
  156. *@paramstr
  157. *@return编码后的字符串,当异常时返回原始字符串。
  158. */
  159. publicstaticStringencode(Stringurl){
  160. try{
  161. returnURLEncoder.encode(url,CHARACTER_ENCODING);
  162. }catch(UnsupportedEncodingExceptionex){
  163. returnurl;
  164. }
  165. }
  166. }

注意上述requestPostForm()方法,是用来提交表单的。
测试用例
Java代码 收藏代码
  1. /**
  2. *2009-8-21
  3. */
  4. packageorg.zlex.commons.net;
  5. importstaticorg.junit.Assert.*;
  6. importjava.util.Properties;
  7. importorg.junit.Test;
  8. /**
  9. *网络工具测试
  10. *
  11. *@author梁栋
  12. *@version1.0
  13. *@since1.0
  14. */
  15. publicclassNetUtilsTest{
  16. /**
  17. *Testmethodfor
  18. *{@linkorg.zlex.commons.net.NetUtils#requestPost(java.lang.String,byte[])}
  19. *.
  20. */
  21. @Test
  22. publicfinalvoidtestRequestPostStringByteArray()throwsException{
  23. PropertiesrequestProperties=newProperties();
  24. //模拟浏览器信息
  25. requestProperties
  26. .put(
  27. "User-Agent",
  28. "Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;TencentTraveler;.NETCLR1.1.4322)");
  29. byte[]b=NetUtils.requestPost("http://localhost:8080/zlex/post.do",
  30. "XML".getBytes());
  31. System.err.println(newString(b,"utf-8"));
  32. }
  33. /**
  34. *Testmethodfor
  35. *{@linkorg.zlex.commons.net.NetUtils#requestPostForm(java.lang.String,java.util.Properties)}
  36. *.
  37. */
  38. @Test
  39. publicfinalvoidtestRequestPostForm()throwsException{
  40. PropertiesformProperties=newProperties();
  41. formProperties.put("j_username","Admin");
  42. formProperties.put("j_password","manage");
  43. byte[]b=NetUtils.requestPostForm(
  44. "http://localhost:8080/zlex/j_spring_security_check",
  45. formProperties);
  46. System.err.println(newString(b,"utf-8"));
  47. }
  48. }

测试用例中的第二个方法是我用来测试SpringSecurity的登录操作,结果是可行的!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值