Http,即超文本传输协议,是建立在TCP/IP协议的基础上。在Web开发的过程中,Http协议是十分重要的,浏览器与服务器之间的交互就是基于Http协议的。Http协议如果展开全面讲解会有很多内容,这里主要分析Http协议的请求与回复中的内容格式、相应的消息头以及几种状态码。
一、Http请求
完整的http请求包括:一个请求行、若干消息头、若干请求的实体内容(消息头和请求内容之间用一条空行隔开);
1、请求行
用于描述客户端的请求方式,请求的资源名称,以及使用的HTTP协议版本号;
如:GET /test/hello.html HTTP/1.1;其中的GET成为请求方式,请求方式有:POST、GET、HEAD、OPTIONS、TRACE、PUT常用的有:POST、GET。其中的HTTP/1.1表示协议版本号,HTTP/1.0是短连接,HTTP/1.1是长连接,其中长度是指连接保留的时间长短。
get与post之间的区别:
(1)GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分隔URL和传输的数据,多个参数之间用&连接;POST提交,把提交的数据放置在HTTP包的包体中,即GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变。
(2)传输数据大小:HTTP协议对传输数据大小和URL长度没有进行限制;GET提交在一些浏览器和服务器中会对URL长度进行限制(如IE对URL长度的限制是2083字节);POST提交不通过URL传值,所以理论上对传输数据大小没有限制(建议不要大于64K)。
(3)安全性:POST提交的安全性更高。
2、消息头
用于描述客户端请求哪台主机,以及客户端的一些环境信息;
注意:并不是每次请求的消息头都一样
下面来看完整的消息头:
Accept: text/html,image/* [通知服务器,客户端可以接收的内容有:文本、网页和图片等]
Accept-Charset: IS0-8859-1 [浏览器接收的字符编码为IS0-8859-1]
Accept-Encoding: gzip,compress [可以接受gzip,compress压缩后的数据]
Accept-Language: en-us,zh-cn [浏览器支持中、英文]
Host: www.google.com:80 [要访问的主机是 www.google.com:80]
If-Modified-Since: Tue , 11 Jul 2000 18:23:51 GMT [通知服务器客户端本地的缓冲文件的时间]
Referer: http://www.google.com/index.html [告诉服务器这个请求来之哪个页面,这个消息头常用来防止盗链]
User-Agent: Mozilla/4.0(compatible:MSIE5.5;Windows NT 5.0) [告诉服务器客服端浏览器的内核]
Cookie: [cookie]
Connection: close/Keep-Alive [保持连接,发完数据后不立刻断开连接]
Date: Tue, 11 Jul 2000 18:23:51 GMT [浏览器发送该http请求的时间]
3、发送的内容
格式为:内容名=内容体,多个内容使用&隔开
二、Http响应
完整的http响应包括:状态行、多行消息头、回复实体内容(消息头和内容之间依然用一条空行隔开)。
1、状态行:
用于描述服务器对请求的处理结果;
格式:HTTP版本号 状态码 原因叙述<CRLF>
如:HTTP/1.1 200 0K;
其中状态码是一个三位的十进制数,用于表示服务器对请求的处理结果,响应状态码分为5类:
状态码 |
含义 |
100~199 |
表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程 |
200~299 |
表示成功接收请求并已完成整个处理过程,常用200 |
300~399 |
为完成请求,客户需进一步细化请求。例如,请求的资源已经移动到一个新地址,常用302、307 |
400~499 |
客户端的请求有错误,常用404。例如访问的页面不存在 |
500~599 |
服务器端出现错误,常用500 |
2、响应消息头:
用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据描述信息,可以通知客户端如何处理等会儿它回送的数据。
下面来看完整的消息头:
Location: http://www.cnblogs.com/index.jsp [让浏览器定位到该url]
Server: apache tomcat [通知浏览器服务器是tomcat]
Content-Encoding: gzip [告诉浏览器,服务端使用的是gzip进行压缩]
Content-Length: 80 [告诉浏览器回送的数据大小为80个字节]
Content-Language: zh-cn [支持中文]
Content-Type: text/html; charset=utf-8 [回送的内容格式是text/html;编码采用的是utf-8]
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT [告诉浏览器,该资源最后一次的更新时间]
Refresh: 10,url=http://www.baidu.com [过10秒刷新跳转到http://www.baidu.com这个页面]
Content-Disposition: attachment; filename = aaa.txt [告诉浏览器有文件要下载]
Transfer-Encoding: chunked [传输的编码]
Set-Cookie: SS=Q0=5Lb_nQ; path=/search [cookie信息]
Expires: -1 [告诉浏览器缓存数据方式,主要针对IE浏览器]
Cache-Control: no-cache [告诉浏览器如何缓存数据]
Pragma: no-cache [告诉浏览器如何缓存数据]
Connection: close/Keep-Alive [保存连接还是关闭]
Date: Tue, 11 Jul 2000 18:23:51 GMT [回送页面的时间]
3、实体内容
代表服务器向客户端回送的数据;
三、重点
一些网站对界面实时更新要求很高,这时就要注意一个细节,如果只是光标定位到地址栏,按回车键进行刷新,当刷新的页面有缓存的时候就不会重新向服务器发送http请求,有缓存的时候刷新需点击刷新按钮进行刷新。
对个这个问题服务端怎么制定让客户端浏览器不对这些重点页面进行缓存呢?这就涉及到http响应消息头中的Expires、Cache-Control和Pragma这三个消息头了。在制定不缓存的时候这三个都得进行指定,才能很好的兼容多种浏览器。
如:response.setDateHeader("Expires", -1);表示不缓存,这个方法也可以指定缓存到什么时候。