HTTP报文结构
1 HTTP报文结构
起始行
报文头
空行
报文数据
2 HTTP请求报文
请求行、请求头(get请求无Content-type、Content-Length)、空行、请求数据(get请求无请求数据)
POST /index.html HTTP/1.1
Accept-Language:zh-CN
User-Agent:Mozilla/4.0(...)
Connection:Keep-Alive
Cache-Control:no-cache
Content-type: ...
Content-Length: ...
name=king@password@123456
请求行 |
请求方法 URL 协议版本\r\n |
请求头 |
字段名:值\r\n |
|
字段名:值\r\n |
|
...... |
空行 |
\r\n |
请求数据 |
...... |
get和post请求区别
1.提交数据的形式:
GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),会直接展现在地址栏中,以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5 %A5%BD。
如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,
得出如:%E4 %BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
而POST方法则会把数据放到请求数据字段中以&分隔各个字段,请求行不包含数据参数,地址栏也不会额外附带参数
2.提交数据的大小
客户端或服务器的支持的不同限制URL长度:比如IE对URL长度的限制是2083字节(2K+35)
post方式HTTP协议规范中也没有限定,起限制作用的是服务器的处理程序的处理能力。
所以大小的限制还是得受各个web服务器配置的不同而影响。
3.提交数据的安全
POST比GET方式的安全性要高
通过GET提交数据,用户名和密码将明文出现在URL上,get方式安全性会比post弱:
(1)登录页面有可能被浏览器缓存
(2)其他人查看浏览器的历史纪录,就可拿到你的账号和密码
(3)当遇上跨站的攻击时,安全性的更差
3 HTTP响应报文
响应行、响应头、空行、响应数据(文本、html、字节流数据)
HTTP/1.1 200 OK
Server://服务器通过这个头告诉浏览器服务器的类型
Date://消息发送的时间
Allow:
Content-Encoding:
Last-Modified://指定服务器上保存内容的最后修订时间
Expires:
Location://配合302使用
Refresh://告诉浏览器隔多久刷新一次
Set-Cookie://设置和页面关联的Cookie
WWW-Authenticate:
response.setHeader("WWW-Authenticate", "BASIC realm=\""executives\"")
响应行 |
协议版本 状态码 描述\r\n |
响应头 |
字段名:值\r\n |
|
字段名:值\r\n |
|
...... |
空行 |
\r\n |
响应数据 |
...... |
状态码说明:
100~199:成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。
200~299:成功接收请求并已完成整个处理过程。常用200
300~399:未完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(跳转到新地址),307和304(不响应资源,让客户端自己拿缓存)
400~499:客户端的请求有错误,常用404(请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够)
500~599:服务器端出现错误,常用500
其中三种禁止浏览器缓存的头字段:
Expires:-1或0
Cache-Control:no-cache
Pragma:no-cache