`
wxyfighting
  • 浏览: 190978 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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的登录操作,结果是可行的!
分享到:
评论

相关推荐

    Java 技术文档整理汇总大全

    9.网络10.日志 11.Zookeeper 12.Kafka 13.RabbitMQ 14.Hbase 15.MongoDB 16.Cassandra 17.设计模式 18.负载均衡 19.数据库 20.一致性算法 21.JAVA算法 22.数据结构 23.加密算法 24.分布式缓存 25.Hadoop 26.Spark 27...

    JAVA后端计算机网络面试题(整理)

    作者最近也是面临离职,重找下家的情况,之前大学学过的《计算机网络》,自己看过《TCP/IP》一些的书,发现作为一个java工程师,对于网络的概念划分不清。因为互联网本身有一定的模型分层,所以本文,根据模型分层,...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    关于java程序员发展需要学习的路线整理集合 技术 应用技术 计算机基础知识 cpu mem disk net 线程,进程 第三方库 poi Jsoup zxing Gson 数据结构 树 栈 链表 队列 图 操作系统 linux 代码控制...

    JAVA核心知识点整理.pdf

    本资源为整理网络上Java工作中常用的知识点,主要针对工作问题和面试问题,对于各个阶段的Java程序员有很强的实用性

    java互联网面试题整理

    整理互联网常见面试题,为春招、校招和社招做准备。如若不能下载,关注公众号“每日技术分享”,可免费下载资源。

    java服务端面试题整理.zip

    Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 数据库相关:包括关系型数据库和非关系型数据库的使用,以及JDBC、MyBatis等...

    JAVA核心面试知识整理.pdf

    文档内容包括JVM,JAVA基础,数据库,计算机网络,微服务等知识点。

    基于Java的双代号网络图自动绘制系统研究与实现.zip

    (3)根据对需求的分类、整理,结合当前可利用的技术手段,设计系统原型; (4)实现系统。使用Java、stripes,实现编号、布点等核心算法与服务器端MVC结构、后台与前台的数据交互接口;通过HTML、CSS、JavaScript、Ajax...

    Java 笔试、面试 知识整理.zip

    Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 数据库相关:包括关系型数据库和非关系型数据库的使用,以及JDBC、MyBatis等...

    搜索链接Java网络爬虫(蜘蛛)源码-zhizhu.zip

    Java网络爬虫(蜘蛛)源码_zhizhu.zip是一个基于Java语言开发的网络爬虫项目,适用于毕业设计、课程设计等场景。该项目主要功能是通过网络爬虫技术,自动抓取互联网上的信息,并将这些信息进行整理和存储。这个项目的...

    Java开发面试题整理含答案(计网、Java、操作系统、数据库、框架).zip

    Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 数据库相关:包括关系型数据库和非关系型数据库的使用,以及JDBC、MyBatis等...

    Java开发者或者大数据开发者面试知识点整理.zip

    Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 数据库相关:包括关系型数据库和非关系型数据库的使用,以及JDBC、MyBatis等...

    JAVA核心面试知识整理

    9. 网络 10. 日志 11. ZOOKEEPER 12. KAFKA 13. RABBITMQ 14. HBASE 15. MONGODB 16. CASSANDRA 17. 设计模式 18. 负载均衡 19. 数据库 20. 一致性算法 21. JAVA 算法 22. 数据结构. 23. 加密算法. 24. 分布式缓存 ...

    「Java面试核心」- 计算机网络知识合集整理

    包括Java基础、Java并发、JVM、MySQL、Redis、Spring、MyBatis、Kafka、计算机操作系统、计算机网络、系统设计、多个、Java项目实战等

    JAVA 五年的工作经验和学习笔记

    本文档是本人5年JAVA经验整理的文档(持续性的),由于CSDN只能单个附件只能上传15MB,所以只好分包压缩了(4个包),希望各位同行能够理解。 本文档包括JAVA/FLEX/数据建模/Database/移动办公/项目管理/单点登录/...

    java各知识点详细总结(毕向东笔记整理)

    java各知识点详细总结(毕向东笔记整理)。第一章:编程基础 3-11 第二章:数组 11 -31 第三章:面向对象程序开发 31 -74 第四章:异常机制 74 -89 第五章:多线程技术 89 -122122122 第六章:常用类 API 122API 122 ...

    【转】技术面试必备基础知识、Leetcode 题解、后端面试、Java 面试、春招、秋招、操作系统、计算机网络、系统设计.zip

    Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 数据库相关:包括关系型数据库和非关系型数据库的使用,以及JDBC、MyBatis等...

    Java后端面试手册-Java基础知识

    Java后端面试手册 生成资源简介 Java后端面试手册是一本针对Java后端开发岗位的面试准备指南,旨在帮助求职者更好地准备和应对Java后端面试。...JAVA核心面试知识整理.pdf Java面试手册.pdf 算法小抄官方完整版.pdf

    基于java编程的毕业论文范文5篇

    Java 语言是编程语言史上的一个里程碑,在此基础上形成的 Java Applet技术是综合了计算机图形学、多媒体技术、网络技术的新技术,近年来在很多领域得到了快速的发展和应用。 本文是为大家整理的java的毕业论文范文,...

Global site tag (gtag.js) - Google Analytics