在学习Servlet之前我们有必要了解一下http协议。
HTTP简介
HTTP协议是超文本传输协议,它是用于服务器将文本传送到浏览器的传输协议,HTTP是一个应用层协议,一次HTTP通信由请求和响应构成。
在请求中包含:请求的方法,URL,用户信息,协议版本等信息;
在响应中包含:响应时间,请求成功或失败的标识,协议版本,回复的内容;
HTTP协议是无连接无状态的。
无连接:每次连接只处理一个请求,服务器处理完客户的请求并收到客户的应答后即断开连接。
无状态:协议对于请求没有任何记忆能力,每次请求都是独立的,请求的结果不会受其它请求的影响。
每一次HTTP的请求都是由请求(request)和响应(response)构成,我们来分别谈谈。
HTTP请求
HTTP请求由三部分组成:请求消息行,请求消息头,请求消息体。
1. 请求消息行
GET /HelloWeb/index.html HTTP/1.1
- 请求方式,此例中的GET;
- 资源URI,此处的/HelloWeb/index.html;
- 协议及版本号,HTTP协议,版本1.1;
2. 请求消息头
Host:localhost
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Charset: UTF-8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.6
Cache-Control: max-age=0
Cookie:JSESSIONID=97C4302F3350676F65B5E4409ABA87CF
Referer: http://blog.csdn.net/lfdfhl
Content-Type:application/x-www-form-urlencoded
If-Modified-Since: Wed, 02 Feb 2011 12:04:56 GMT
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36
Connection: keep-alive
Date: Tue, 15 Nov 2017 01:12:31 GMT
- Host:发起请求的主机名及其端口号;
- Accept:客户端可接收的文档类型。其中,
*/*
表示可接收任何类型; - Accept-Charset: 客户端可接受的字符编码集;
- Accept-Encoding: 客户端支持的压缩格式;
- Accept-Language:客户端可接受的语言;
- Cache-Control:设置请求和响应遵循的缓存机制;
- Cookie:HTTP请求发送时会把保存在该请求域名下的所有cookie值一起发送至服务器;
- Referrer:发起HTTP请求的页面的URL;
- Content-Type:请求时所传递的内容的类型;
- Content-Length:请求时所传递的内容的长度;
- If-Modified-Since:该值与响应消息头的Last-Modified字段相对应。Last-Modified与If-Modified-Since都是用来记录页面的最后修改时间。当客户端访问页面时,服务器会将页面最后修改时间通过Last-Modified由服务器发往客户端,客户端会记录下该值;当客户端再次发起请求时,客户端会通过 If-Modified-Since将此前服务器端发过来的最后修改时间戳发送回去;服务器通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的则返回新的内容,如果是最新的则返回304告诉客户端其本地cache的页面是最新的,于是客户端就可直接从本地加载页面;
- User-Agent:表示发出该请求的客户端的相关信息,比如操作系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言等等;
- Connection: 表示是否需要持久连接,HTTP 1.1默认进行持久连接;
- Date: 请求发送的日期和时间;
其实,从这里可以看出来:在每次请求时,客户端需要告诉服务器:自身支持的字符集,压缩格式,语言;请求的消息内容,长度等等众多信息,从而尽量清楚地表达自身的条件和需求以便服务器做出相应的响应。
3. 请求消息体
localhost:8080/MyServlet/servlet/HelloServlet?name=qdl&age=25
消息体:name=qdl&age=25
当请求方式是POST方式时可见消息正文,假若是GET方式则请求消息体中无内容。
HTTP响应
HTTP响应同样由三部分组成:响应消息行,响应消息头,响应消息体。
1. 响应消息行
HTTP/1.1 200 OK
- 协议及其版本号,HTTP/1.1;
- 响应状态码,此处的200;
200,正常
02/307,临时重定向
304,未修改,表示客户端缓存的版本是最新的,无需请求
404,找不到
500,服务器内部出错 - 响应码的描述,此处的OK。
2. 响应消息头
Accept-Ranges: bytes
Content-Encoding: gzip
Content-Length: 4533
Content-Language: en,zh
Content-Type: text/html
Date: Sun, 06 Sep 2015 07:56:07 GMT
Last-Modified: Fri, 04 Sep 2015 13:37:55 GMT
Server: apache tomcat
Location: http://blog.csdn.net/lfdfhl
Refresh: 5; url=http://www.csdn.net/
Content-Disposition: attachment; filename=test.zip
Set-Cookie: UserID=tom; Max-Age=3600; Version=1
Expires: Thu, 01 Dec 2015 12:20:00 GMT
Cache-Control: no-cache
Pragma: no-cache
Connection: keep-alive
- Accept-Ranges: 表明服务器是否支持指定范围请求及哪种类型的分段请求;
- Content-Encoding: 服务器的返回内容的压缩编码类型;
- Content-Length: 服务器的返回内容的的长度;
- Content-Language: 服务器的返回内容的语言;
- Content-Type: 服务器的返回内容的类型;
- Date:服务器发出响应的时间;
- Last-Modified: 返回的内容的最后修改时间;
- Server: 服务器的类型;
- Location:指示被请求的资源的位置,常和请求消息头一起使用完成请求重定向;
- Refresh:延时跳转到某个页面或者定时刷新本页面;
- Content-Disposition: 指示客户端下载文件;
- Set-Cookie: 服务器端发送给客户端的Cookie;
- Expires: 响应过期的时间;
- Cache-Control: 指定响应遵循的缓存机制;
- Pragma: 用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同;
- Connection: 表示是否需要持久连接,HTTP 1.1默认进行持久连接。
3. 响应消息体
响应消息体中表示响应的的具体内容。比如,响应的内容是网页,那么响应消息体的内容和网页右键”查看网页源代码”所看到的内容一样。