`
wxyfighting
  • 浏览: 200944 次
  • 性别: 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核心技术整理

    Java核心技术是Java编程语言的核心组成部分,它包括了Java的基础语法、面向对象编程概念、类库以及JVM(Java虚拟机)的工作原理等多个方面。这里,我们将深入探讨这些关键知识点。 首先,Java的基础语法是学习Java...

    Java常用代码整理

    在"Java常用代码整理"这个主题中,我们可以探讨多个Java编程中的关键知识点,包括基础语法、面向对象特性、异常处理、集合框架、IO流、多线程、网络编程以及实用工具类等。 1. **基础语法**:Java的基础语法包括...

    Java 网络程序设计

    5. 其他标签如HTML Converter、JavaMail API、Socket、Java Plug-in等,这些是Java网络编程中会用到的技术组件和接口。 文档部分内容中,我们可以看到很多技术术语和缩写,有些可能是OCR扫描时识别错误导致的,但...

    java常用技术整理.rar

    "java常用技术整理.rar"这个压缩包很可能包含了关于Java开发的各种关键知识点和实用技巧的总结。以下是一些Java中常见的技术和概念,它们可能是压缩包内容的一部分: 1. **基础语法**:Java的基础语法包括变量声明...

    Java开发技术大全源码整理

    【Java开发技术大全源码整理】是一份集大成的Java编程学习资源,包含了丰富的Java开发相关的源代码示例和教程。这份资料旨在帮助开发者深入理解Java编程语言,提升编程技能,同时也为初学者提供了宝贵的实践参考。 ...

    java核心技术-整理过的笔记

    2. **Java EE(Enterprise Edition)**:企业版,针对大型企业级网络应用。 3. **Java ME(Micro Edition)**:微型版,适用于嵌入式设备和移动终端。 #### 二、开发环境搭建 开发Java应用,首先需搭建以下环境: -...

    JAVA核心面试知识整理.pdf

    Java核心面试知识整理包括了对JVM内存区域、...总结而言,这份面试知识点整理为Java开发者提供了一个全面、系统的复习框架,帮助面试者巩固和加深对Java核心技术的理解,以便在面试中展现出扎实的理论基础和实践能力。

    java笔试试题整理

    11. **Java EE**:如果面试涉及Web开发,那么对Servlet、JSP、JDBC、EJB、Spring、Hibernate等Java企业版技术的理解也是必不可少的。 12. **Java 8及更高版本的新特性**:例如lambda表达式、流(Stream API)、...

    JAVA开发网络游戏(英文版)Java实用源码整理learns

    这个资源包,"JAVA开发网络游戏(英文版)Java实用源码整理learns",显然包含了有关这个主题的实用代码示例和学习材料,旨在帮助Java程序员提升在游戏开发领域的技能。 首先,我们要理解Java作为编程语言在游戏开发中...

    java常用技术整理-基础架构方面.rar

    这份"java常用技术整理-基础架构方面.rar"的压缩包文件很可能包含了一系列关于Java基础架构技术的文章、笔记或教程,旨在帮助开发者系统地学习和掌握这些知识。 首先,Java的基础架构涉及JVM(Java虚拟机)。JVM是...

    Java开发技术大全Java实用源码整理learns

    Java开发技术大全,Java实用源码整理,是Java开发者深入学习和实践的重要资源集合。这份压缩包文件包含了一些关键的学习材料,旨在帮助开发者提升技能,理解并掌握Java编程的核心概念和高级特性。 首先,让我们来看...

    Java从网络取得文件源码整理

    在Java编程语言中,从网络获取文件是一项常见的任务,它涉及到网络编程和I/O操作。...以上就是关于Java从网络获取文件的核心知识点,理解并熟练运用这些技术,可以编写出高效且可靠的文件下载程序。

    java面试题整理集合

    在Java领域,面试是评估求职者技术实力的重要环节。这份整理集合涵盖了Java编程语言的基础、进阶、并发、内存管理、框架等多个方面,旨在帮助准备面试的开发者全面了解并掌握Java的核心知识。以下是对这些知识点的...

    java面试(整理).rar

    Java面试是每位Java开发者在职业发展道路上必须面对的挑战,它涵盖了广泛的理论和技术知识。这份“java面试(整理).rar”压缩包文件显然包含了针对Java面试精心整理的资料,旨在帮助求职者准备面试,提升成功的机会...

    Java核心面试知识整理.pdf

    接下来是Java IO/NIO的内容,Java IO是指传统的输入输出流模型,基于阻塞IO模型,而NIO(New IO)则是引入了缓冲区、通道(Channel)和选择器(Selector)等概念,支持非阻塞IO模型,它允许单线程处理多个网络连接。...

    java技术网经典资料整理

    这份"java技术网经典资料整理"的压缩包显然包含了丰富的学习资源,旨在帮助开发者深入理解和掌握Java编程语言。以下将针对Java技术的各个方面进行详细的阐述。 1. **Java基础**:Java的基础包括语法、数据类型、...

    Java面试题整理.docx

    ### Java面试题整理知识点 #### 数据结构理解与应用 **数据结构定义与分类:** - **集合结构**:集合中的元素除同属于一种类型外,彼此间没有其他关系。 - **线性结构**:线性结构中的数据元素之间存在一对一的...

    JAVA核心知识点整理.pdf

    对于Java开发者来说,理解Java的核心知识点是非常重要的,这些知识点包括但不限于JVM(Java虚拟机)机制、多线程与并发、Java基础、Spring框架原理、微服务架构、网络编程、日志系统、分布式协调服务Zookeeper、消息...

    140个java源码实例Java实用源码整理learns

    《140个Java源码实例Java实用源码整理learns》这一资源的出现,恰好满足了广大Java学习者的需求。 该资源以实例的形式,提供了140个精选的Java源码,涵盖了Java编程的各个方面。无论是Java基础概念,如控制流、循环...

Global site tag (gtag.js) - Google Analytics