Java web基础总结之二——http协议
由于java web是基于B/S的,所以http协议是java web 最基础,也非常重要的知识。HTTP协议用于定义客户端与web服务器之间进行通信的格式。从web服务器中获得某个web资源或者web 服务器接受客户端的请求都需要遵守一定的通讯格式,就是http协议。
一.HTTP协议是什么?
HTTP协议是学习java web的基石,同时也是管理和维护一些复杂的WEB站点的必备的基础,如果你想要深入的理解java web的服务器的实现,就更需要掌握它。
HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是在TCP/IP协议之上的一个应用层协议,默认的端口是80,用于定义WEB浏览器与WEB服务器之间交换数据的格式和规范。
HTTP协议是无状态的协议,是因为一个web服务器并不会保存关于客户机的任何的信息。在B/S架构中,web服务器总是打开的,具有固定的IP地址,同时服务成千上万的不同的浏览器。
HTTP协议有两个版本:HTTP/1.0、HTTP/1.1。现在基本使用的都是HTTP/1.1。他们之间有一个重要的区别:在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源。HTTP1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源。也就是常说的持久连接。
二.持久连接和非持久连接的区别
一个web页面,也被称为文档。是由对象组成的,简单的说,对象就是文件,比如html文件,图片文件等等。大部分的web页面含有一个基本html文件以及多个引用对象。比如一个web页面含有一个基本的html文件和2个图片文件,那么这个web页面就有6个对象。基本html文件通过对象的URL地址对对象进行引用。URL地址由两部分组成:存放对象的服务器的主机名和对象相对于主机的路径名。例如:
http://c.csdnimg.cn/www/images/pic_foot_BNIA.png 中的 c.csdnimg.cn就是主机名,
/www/images/pic_foot_BNIA.png就是路径名。
非持久连接就是当客户端请求一个web页面时,对每一个对象的请求/响应都是经过一个单独的TCP连接发送。例如,如果一个web页面包含一个基本html文件和5个JPEG的图片文件。则使用非持久连接时,用户请求这个页面,会建立11个TCP连接。
持久连接则是对一个页面的请求,甚至在同一个服务器上的多个web时,都可以在单个的持久TCP连接上进行传送。比如上面的例子中,可能只需要一个持久的TCP连接。一般来说,如果一个连接经过一定的时间间隔没有被使用,HTTP服务器就会关闭这个连接。
三.HTTP的请求
客户端的浏览器连上web服务器后,会向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。一个完整的HTTP请求包括:一个请求行、一些消息头、和实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。
1. 请求行
请求行中需要注意的是请求方式,主要有:
POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
我们常用的有:POST、GET 。其他的比较少遇到,这里就不多叙述了。
POST或GET,都是用于客户端向服务器请求某个WEB资源,他们都可以带一些数据给服务器,但是他们有一定的区别:
如请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:
GET/aaa/bbb?name=ccc&password=ddd HTTP/1.1
GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量不能超过1K。可以看到,使用GET请求方式时,参数是显示在浏览器的输入框里的,所以是可见的。
当请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,例如:
POST /user/loginHTTP/1.1
Host:
Content-Type:application/x-www-form-urlencoded
Content-Length:28
name=aaa&password=bbb
Post方式的特点:传送的数据量没有大小的限制,而且参数不会在浏览器的地址框里显示。
2. 消息头
http请求头是必须存在的,它携带了很多的重要的信息,比如客户端的浏览器的标识,下面是HTTP请求中的常用头:
Accept: text/html,image/*
Accept-Charset: ISO-8859-1
Accept-Encoding: gzip,compress
Accept-Language: en-us,zh-cn
Host: http://www.csdn.net:80
If-Modified-Since: Tue, 11 Jul 2010 18:23:51 GMT
Referer: http:// http://www.csdn.net
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Cookie
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2010 18:23:51 GMT
四.HTTP的响应
和HTTP的请求相对应,一个HTTP响应表示服务器向客户端回送的数据,它也包括三个部分:一个状态行、若干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用一个空行作为间隔。
状态行中需要知道的就是状态码,状态码表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码总共分为5类,如下所示:
100~199 |
表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程 |
200~299 |
表示成功接收请求并已完成整个处理过程,常用200 |
300~399 |
为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址,常用302、307和304。比如304的重定向 |
400~499 |
客户端的请求有错误,常用如403的禁止访问和404的找不到资源 |
500~599 |
服务器出现错误,比如服务器端程序抛出了异常,常用 500。 |
和 HTTP请求头一样,HTTP也有一些常用的响应头,如下所示:
Location: http:// www.csdn.net
Server:apache tomcat
Content-Encoding: gzip
Content-Length: 80
Content-Language: zh-cn
Content-Type: text/html; charset=GB2312
Last-Modified: Tue, 11 Jul 2010 18:23:51 GMT
Refresh: 1;url=http://www.csdn.net
Content-Disposition: attachment; filename=aaa.zip
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/aaa
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
需要注意的是,有一些通用的消息头,既可以用于请求,也可以用于响应,比如:
Cache-Control:no-cache 用于指定是否需要缓存
Pragma:no-cache Pragma: no-cache兼容http 1.0 ,Cache-Control:no-cache是http 1.1新加的消息头。
Connection:close/Keep-Alive 这个就是控制是持久连接还是非持久连接。
Date: Tue, 11Jul 2000 18:23:51 GMT