- 浏览: 1324756 次
- 性别:
- 来自: 湖南澧縣
文章分类
最新评论
-
虾米小尹:
不行啊!2.2-0.25=1.9500000000000002 ...
JavaScript浮点数运算 —— 精度问题 -
heluping000000:
引用String a= "abc",首先在 ...
String,到底创建了多少个对象? -
mack:
谢谢分享matcher.appendReplacement(s ...
string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement -
wzt3309:
完全理解,比网上其他资料都要详细
String,到底创建了多少个对象? -
u014771876:
Java中十六进制转换 Integer.toHexString()
在开发Web程序时,我们向Web服务发送请求是最常见的事,如果了解向服务器提交的HTTP码流,对有些问题我们就会有很好的把握,比如HTTP信息结构、乱码产生、表单参数以及URL绑定参数的传递提交机制,对我们提交的数据心中有数。下面我们就来看看通过表单与URL两种提交请求方式时各自的HTTP码流究竟如何?先来了解了解HTTP消息格式。
HTTP消息格式
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
1、请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。
GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
2、请求头部 3、空行
POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,可用来传送文件。
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
对于一个完整的http请求来说空行是必须的,否则服务器会认为本次请求的数据尚未完全发送到服务器,处于等待状态。
4、请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
了解了HTTP消息格式后,先我们要模拟服务器,让客户端往我们模拟服务器发送,这样我们就可以截获码流。下面是服务器模拟程序:
客户端HTTP码流端截取程序
import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.ServerSocket; import java.net.Socket; public class HttpServer { public static void main(String[] args) { try { ServerSocket sSocket = new ServerSocket(8088); Socket socket = sSocket.accept(); InputStream is = socket.getInputStream(); //String encode = "GB2312"; String encode = "UTF-8"; putStream(is, encode); } catch (IOException e) { e.printStackTrace(); } } public static void putStream(InputStream is, String encode) throws IOException, UnsupportedEncodingException { byte[] content = new byte[1024]; int readCount = is.read(content); OutputStreamWriter bos = new OutputStreamWriter(System.out); while (readCount != 0) { bos.write(new String(content, 0, readCount, encode)); bos.flush(); readCount = is.read(content); } is.close(); } }
POST方式提交表单并且URL后面绑定参数
JSP页面如下:
<%@ page language="java" contentType="text/html; charset=GB2312" pageEncoding="GB2312"%> <html> <body> <form name=form1 action="" method="post"> <input type="text" name="textParam1" size="50 px" value="中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./"> <br> <input type="file" name="fileParam" size="50 px" value=""> <br> <input type="button" value="submit" onclick="submitForm()"> </form> <script type="text/javascript"> function submitForm(){ var str ="中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./"; //form1.action = "gb2312rs.jsp?qryParam1=" + encodeURIComponent(str) + "&qryParam2="+ encodeURIComponent(form1.textParam1.value) ; form1.action = "http://localhost:8088/gb2312rs.jsp?qryParam1=" + encodeURIComponent(str) + "&qryParam2="+ encodeURIComponent(form1.textParam1.value) ; form1.submit(); } </script> </body> </html>
页面截图:
提交后地址栏如下:
http://localhost:8080/HttpStream/gb2312rs.jsp?qryParam1=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%22%20%3C%3E%3F%60-%3D%5B%5D%5C%3B'%2C.%2F&qryParam2=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%5C%22%20%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B'%2C.%2F
HTTP消息码流:
POST /gb2312rs.jsp?qryParam1=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%22%20%3C%3E%3F%60-%3D%5B%5D%5C%3B'%2C.%2F&qryParam2=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%5C%22%20%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B'%2C.%2F HTTP/1.1 textParam1=%D6%D0a+%7E%21@%23%24%25%5E%26*%28%29_%2B%7B%7D%7C%3A%5C%22+%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B%27%2C.%2F&fileParam=file1.txt
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://localhost:8080/HttpStream/gb2312.jsp
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8088
Content-Length: 132
Connection: Keep-Alive
Cache-Control: no-cache
从上面码流分析可知:
- URL后绑定的参数会显示在HTTP消息头中。
- 文件类型没有传到服务器,因为表单未设置enctype="multipart/form-data",但文件名却传过来了。
- 提交请求为编码方式为GB2312的页面表单时,参数qryParam1与参数qryParam2都是UTF-8的编码格式,而不是以GBP312方式编码的,因此encodeURIComponent()函数是固定以UTF-8编码的,它不会受到当前浏览器的编码影响。
- 经过encodeURIComponent()函数编码后的附加参数内容会以%xx形式串显示在地址栏中。
- POST方式的HTTP头与HTTP体是用一个回车换行来分隔的。
- POST方式提交表单,如果URL后面还附还参数,也会提交到服务器,且放在HTTP头部,其他表单输入元素会放在HTTP体里传送。
- POST方式提交表单时,在头部会有 Content-Type: application/x-www-form-urlencoded 这样一个头信息,而GET方式提交的表单是不会有该头信息的,也不会有HTTP请求体。
- POST方式提交时,表单里的元素值会先用浏览器的编码(这里使用的是GB2312编码)方式时行编码(a-z A-Z 0-9 +@*_-. 不进行编码),然后把编码转换成%xx(xx为两位的十六进制)形式参数串后传送到服务器。
GET方式提交表单
JSP页面如下:
与上面一样,只是表单提交方式改为 get。
页面截图:
与上面一样。
提交后地址栏如下:
http://localhost:8088/gb2312rs.jsp?textParam1=%D6%D0a+%7E%21@%23%24%25%5E%26*%28%29_%2B%7B%7D%7C%3A%5C%22+%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B%27%2C.%2F&fileParam=file1.txt
HTTP消息码流:
从上面码流分析可知:
文件上传时HTTP码流
JSP页面如下:
<%@ page language="java" contentType="text/html; charset=GB2312" pageEncoding="GB2312"%> <html> <body> <form name=form1 action="" method="post" enctype="multipart/form-data"> <input type="text" name="textParam1" size="50 px" value="中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./"> <br> <input type="file" name="fileParam1" size="50 px" value=""> <br> <input type="file" name="fileParam2" size="50 px" value=""> <br> <input type="button" value="submit" onclick="submitForm()"> </form> <script type="text/javascript"> function submitForm(){ var str ="中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./"; form1.action = "http://localhost:8088/gb2312rs.jsp?qryParam1=" + encodeURIComponent(str) + "&qryParam2="+ encodeURIComponent(form1.textParam1.value) ; form1.submit(); } </script> </body> </html>
页面运行图:
HTTP消息码流:
POST /gb2312rs.jsp?qryParam1=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%22%20%3C%3E%3F%60-%3D%5B%5D%5C%3B'%2C.%2F&qryParam2=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%5C%22%20%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B'%2C.%2F HTTP/1.1
-----------------------------7d9165750396
中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./
这是第一个测试文件的内容:
这是第二个测试文件的内容: |
码流分析:
- 文件上传时表单要设置 enctype="multipart/form-data" 属性。
- 上传时文件与参数一起放置在HTTP体里传送,并且参数不组以%XX形式传送,而是经过浏览器编码后直接传送到服务器,但文件内容就不同了,浏览器读取要上传文件时,不会使用任何编码来读取,而是原样读取(即在上文件时浏览器是以字节流形式读取文件的,而不是以字符形式来读取的,否则会涉及到编码问题)后发往服务器(试想下,如果浏览读取上传文件时还经过了浏览器编码,那我们上传的非字符性文件会坏掉)。
- 消息头含有Content-Length属性,它表示消息体的总体长度。
附件为码流文件
参考:
http://blog.csdn.net/yc0188/archive/2009/10/29/4741871.aspx
发表评论
-
Java正则表达式
2014-03-14 10:16 1710Java正则表达式详解 作者:jzj 文 ... -
类的初始化与清理
2013-06-24 22:20 1404初始化时内存清零 当创建一个对象时,首先将在堆上为这个对象分 ... -
protected,这个错了吗?
2013-06-24 22:17 1190这几天对protected修饰符有点迷糊,随便找同事要了一本 ... -
Java中BigDecimal的8种舍入模式
2013-06-21 18:42 2136java.math.BigDecimal不可变的、任意精度的 ... -
Tomcat性能参数设置
2010-12-27 15:35 34689默认参数不适合生产环境使用,因此需要修改一些参数 1、 ... -
Java 6 JVM参数选项大全
2010-12-14 11:16 1590http://kenwublog.com/docs/java6 ... -
对象的安全构造
2013-06-21 18:43 1501在构造期间,不要公布“this”引用 一种可以将数据争用引 ... -
Java断言(assert)—— 转
2010-06-20 10:36 12028一、概述 在C和C++语言中都有assert关键,表示断言。 ... -
eclipse调试
2010-06-04 00:11 7996eclipse远程调试 在eclipse3.4前,远程调试时 ... -
protected,你真的理解了吗?
2010-05-09 17:56 2079Java中的访问控制修饰符有四个级别,但属protected最 ... -
利用反射进行深层克隆
2010-05-05 21:02 3622最近在看《effective java ... -
类与类之间的几种关系
2010-05-03 13:49 2370类和类、类和接口、接 ... -
运行java
2010-05-03 13:47 1007用javac命令编译一个打包的类时,如果没有加参数" ... -
Java内存模型与volatile
2010-04-25 13:21 18486内存模型描述的是程序 ... -
中断线程
2010-04-24 21:19 8904中断线程 线程的thread.i ... -
java中的关键字、保留字、标示符
2010-04-07 23:48 3324关键字 Java的关键字对java的编译器有特殊的意义, ... -
Java中的浮点数剖析
2010-04-07 23:27 4648定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固 ... -
线程间的同步与互斥
2010-03-23 21:29 2258线程间的同步(实指线程间的通信):一般来说,一个线程相对于另 ... -
UTF-16、UTF-16BE、UTF-16LE编码方式的区别
2010-03-23 21:20 9687import java.io.IOException; ... -
final、finally、finalize
2010-01-22 01:15 2327final关键字 先看看final关键字,它可以被用于以下几个 ...
相关推荐
供应链管理系统(SCM):整合供应商、制造商、分销商、零售商等供应链各环节,实现物流、资金流、信息流的协同运作。 企业资源计划系统(ERP):对企业内部财务、生产、采购、库存、销售等各项资源进行全面集成...
产品特点资源管理器:章鱼JSON-RPC客户端实现与区块链平台进行通信反汇编程序:章鱼可以将字节码转换为汇编表示形式控制流分析:章鱼可以生成控制流图(CFG) 呼叫流分析:章鱼可以生成一个呼叫流图(功能级别) IR...
本次课程设计的题目是银行储蓄业务管理系统,业务流分析: 本软件实现银行的活期储蓄存款业务,整套软件由客户端程序和服务端程序构成,,客户端运行在面向个人业务的银行柜台的电脑上,银行职员输入相关信息并通过网络...
本次课程设计的题目是银行储蓄业务管理系统,业务流分析: 本软件实现银行的活期储蓄存款业务,整套软件由客户端程序和服务端程序构成,,客户端运行在面向个人业务的银行柜台的电脑上,银行职员输入相关信息并通过网络...
2.1.1 可行性分析 - 9 - 2.1.2系统功能需求 - 9 - 2.1.3 系统性能需求 - 10 - 2.1.4 系统运行需求 - 10 - 2.2.1 顶层数据流图 - 10 - 2.2.2 一层数据流图 - 11 - 2.2.3 二层数据流图 - 11 - 3 概要设计 - 12 - 3.1...
客户端软件的MPEG一4视频解码实现进行了研究,分析了MPEG一4码流并给出了解 码器流程图,实现了Symbian平台上MPEG一4视频解码。对解码器的优化方法进 行了讨论,对比了两种IDCT算法,对解码器IDCT过程进行优化,并在...
由于可以搭配使用的相关免费资源相当的多,PHP 的网页设计越来越多人在学习了,MPS PHP DESIGNER 是针对 PHP 网页的编写所设计的程序,它内建一系列的指令码、PHP4 原始码数据库、语法高亮度显示功能、FTP 客户端....
基本功能: 图形化流程设计/智能表单web定义免程序开发/级联下拉框/流程轨迹/单据自定义打印/邮件短信工作到达通知/自动任务分配/支持sdk模式开发/简洁集成/消息侦听/丰富事件接口/报表定义/工作量分析/绩效考核/手机...
目 录 1、开发背景 3 2、系统描述 3 3、数据分析 4 3.1 数据流图 4 3.2 数据字典 5 4、概念模型设计 10 5、 逻辑模型设计及优化 12 6、课程设计心得体会 14 1、开发背景 随着学校的发展,越来越多的学生来学校求学,...
由于可以搭配使用的相关免费资源相当的多,PHP 的网页设计越来越多人在学习了,MPS PHP DESIGNER 是针对 PHP 网页的编写所设计的程序,它内建一系列的指令码、PHP4 原始码数据库、语法高亮度显示功能、FTP 客户端.....
需求分析 (1)用户的基本需求: 用户对银行存取款客户端的要求不高,他们需要的是自己通过直接操作来获得自己所需要的服务,如存款、取款、转账、查询、修改密码、缴费等。每一个功能,用户都可以根据系统的提示一步...
其中,服务器端实时采集报像头传送的动态图像,进行IPEG编码,选过网络传送码液到客户端:客户端接收码流,经过PEG解码,怏复出原始图像送vGA显示,设计结果完全达到了实时性的要求. 本文从系统实现的...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
" " (4)通过数据输入输出流与客户端进行数据读写,完成双向通信。 " " (5)当客户端断开连接时,关闭各个流对象,结束通信。 " "该部分主要由Server、ServerThread和GetConnection3个类组成。 " "b)客户端 " "(1)...
3.4.4 使用PrismNetworkStream类封装网络流 120 3.4.5 使用PrismServerImplementation组件管理用户信息 123 3.4.6 类库中的实体类 128 3.4.7 用户信息对话框组件的实现 129 3.4.8 服务器统计信息对话框组件的...
a)、自动的客户端脚本分析器,允许对Ajax和Web 2.0应用程序进行安全性测试 b)、业内最先进且深入的SQL 注入和跨站脚本测试 c)、高级渗透测试工具,例如HTTP Editor 和HTTP Fuzzer d)、可视化宏记录器帮助您轻松测试...
请单击以下链接: Trade Workstation API,请参考客户端门户API,请参考第三方API,请参考API中有什么认证方式帐户端点市场数据端点贸易端点投资组合端点扫描仪端点投资组合分析端点网络流媒体设置要求使用此API必须...
分析了现有的几种一次性口令系统,指出服务端的不安全性、对S/KEY的小数攻击等问题,在此基础上提出并实现了双向认证一次性口令协议TAOTP(Twoway Authenticate One Time Password),采用单向函数,通过客户端和...