1.定义:
HTTP 是 Hyper Text Transfer Protocol(超文本传输协议)的缩写。HTTP 协议是用于从 WWW 服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。HTTP 是一种无状态的协议,无状态是指 Web 浏览器和 Web 服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后 Web 服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息。HTTP 遵循请求(Request) / 应答(Response)模型。Web 浏览器向 Web 服务器发送请求,Web 服务器处理请求并返回适当的应答。2.工作流程
Web 浏览器与 Web 服务器之间将完成下列 7 个步骤:(1)建立 TCP 连接
在 HTTP 工作开始之前,Web 浏览器首先要通过网络与 Web 服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接。因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是 80。
(2)Web 浏览器向 Web 服务器发送请求命令
一旦建立了 TCP 连接,Web 浏览器就会向 Web 服务器发送请求命令
例如:GET/test/test.jsp HTTP/1.1
(3)Web 浏览器发送请求头信息
浏览器发送其请求命令之后,还要以头信息的形式向 Web 服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
(4)Web 服务器应答
浏览器向服务器发出请求后,服务器会向浏览器回送应答
例如:HTTP/1.1 200 OK
应答的第一部分是协议的版本号和应答状态码
(5)Web 服务器发送应答头信息
正如浏览器会随同请求发送关于自身的信息一样,服务器也会随同应答向浏览器发送关于它自己的数据及被请求的文档。
(6)Web 服务器向浏览器发送数据
Web 服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 应答头信息所描述的格式发送用户所请求的实际数据。
(7)Web 服务器关闭 TCP 连接
一般情况下,一旦 Web 服务器向浏览器发送了请求数据,它就要关闭 TCP 连接。如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive
TCP 连接在发送后将仍然保持打开状态。于是,浏览器可以继续通过相同的连接发送请求。
3.HTTP 请求格式
当浏览器向 Web 服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP 请求信息由 3 部分组成:(1)请求方法 URI 协议/版本
(2)请求头(Request Header)
(3)请求正文
下面是一个 HTTP 请求的例子:
GET/test/test.jsp HTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=XXX&password=****
说明:(1)请求方法 URI 协议/版本
以上代码中 “GET” 代表请求方法,“/test/test.jsp” 表示 URI,“HTTP/1.1“ 代表协议和协议的版本。
(2)请求头(Request Header)
请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。
Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate
(3)请求正文
请求头和请求正文之间是一个空行,这个空行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户端提交的查询字符串信息:
例如:username=XXX&password=****
在以上的例子中,请求的正文只有一行内容。当然,在实际应用中,HTTP 请求正文可以包含更多的内容。
请求头常用字段说明:
Accept:浏览器可接受的MIME类型;
Accept-Charset:浏览器可接受的字符集;
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet 能够向支持 gzip 的浏览器返回经 gzip 编码的 HTML 页面。许多情形下这可以减少5到10倍的下载时间;
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;
Authorization:授权信息,通常出现在对服务器发送的 WWW-Authenticate 头的应答中;
Connection:表示是否需要持久连接。如果 Servlet 看到这里的值为 “Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如 Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet 需要在应答中发送一个 Content-Length 头。最简单的实现方法是:
先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;
Content-Length:表示请求消息正文的长度;Cookie:这是最重要的请求头信息之一;
From:请求发送者的 email 地址,由一些特殊的 Web 客户程序使用,浏览器不会用到它;
Host:初始 URL 中的主机和端口;
If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回 304“Not Modified” 应答;
Pragma:指定 “no-cache” 值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝;
Referer:包含一个 URL,用户从该 URL 代表的页面出发访问当前请求的页面。
User-Agent:浏览器类型,如果 Servlet 返回的内容与浏览器类型有关则该值非常有用;
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的 IE 浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型;
HTTP 应答与 HTTP 请求相似,HTTP 响应也由 3 个部分构成,分别是:
(1)协议状态版本代码描述
(2)响应头(Response Header)
(3)响应正文
下面是一个 HTTP 响应的例子:
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
<html>
<head>
<title>HTTP 响应示例<title>
</head>
<body>
Hello World!
</body>
</html>
说明:
(1)协议状态代码描述 HTTP 响应的第一行类似于 HTTP 请求的第一行,它表示通信所用的协议是 HTTP1.1, 服务器已经成功的处理了客户端发出的请求(200 表示成功)。
(2)响应头(Response Header)响应头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等。(3)响应正文就是服务器返回的 HTML 页面。响应头和正文之间也必须用空行分隔。
响应头常用字段说明:
Allow:服务器支持哪些请求方法(如 GET、POST 等);Content-Encoding:文档的编码(Encode)方法。只有在解码之后才可以得到 Content-Type 头指定的内容类型。利用 gzip 压缩文档能够显著地减少 HTML 文档的下载时间。Servlet 可以通过查看 Accept-Encoding 头来检查浏览器是否支持 gzip,为支持 gzip 的浏览器返回经 gzip 压缩的 HTML 页面,为其他浏览器返回普通页面;
Content-Length:表示内容长度。只有当浏览器使用持久 HTTP 连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStram,完成后查看其大小,然后把该值放入 Content-Length 头,最后通过byteArrayStream.writeTo(response.getOutputStream() 发送内容;
Content-Type: 表示后面的文档属于什么 MIME 类型。Servlet 默认为 text/plain,但通常需要显式地指定为 text/html。由于经常要设置 Content-Type,因此 HttpServletResponse 提供了一个专用的方法 setContentType。 可在 web.xml 文件中配置扩展名和 MIME 类型的对应关系;
Date:当前的 GMT 时间。你可以用 setDateHeader 来设置这个头以避免转换时间格式的麻烦;
Expires:指明应该在什么时候认为文档已经过期,从而不再缓存它。
Last-Modified:文档的最后改动时间;
Location:表示客户端应当到哪里去提取文档。Location 通常不是直接设置的,而是通过 HttpServletResponse 的 sendRedirect 方法,该方法同时设置状态代码为302;
Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过 setHeader("Refresh", "5; URL=http://host/path") 让浏览器读取指定的页面。注意这种功能通常是通过设置 HTML 页面 HEAD 区的 <META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path"> 实现,这是因为,自动刷新或重定向对于那些不能使用 CGI 或 Servlet 的HTML 编写者十分重要。但是,对于 Servlet 来说,直接设置 Refresh 头更加方便。注意 Refresh 的意义是“N 秒之后刷新本页面或访问指定页面”,而不是“每隔 N 秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个 Refresh 头,而发送 204 状态代码则可以阻止浏览器继续刷新,不管是使用 Refresh 头还是 <META HTTP-EQUIV="Refresh" ...>。注意 Refresh 头不属于 HTTP 1.1正式规范的一部分,而是一个扩展。
4.HTTP 请求方式
(1)GET 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,应该是幂等的。
(2)POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。
(3)PUT 用于修改某个内容,向指定资源位置上传其最新内容。
(4)DELETE 请求服务器删除 Request-URI 所标识的资源。
(5)OPTIONS 返回服务器针对特定资源所支持的 HTTP 请求方法。也可以利用向 Web 服务器发送 '*' 的请求来测试服务器的功能性。
(6)HEAD 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
(7)TRACE 回显服务器收到的请求,主要用于测试或诊断。
(8)CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
5.HTTP 状态响应码
(1)1**:请求收到,继续处理100——客户端必须继续发出请求
101——客户端要求服务器根据请求转换 HTTP 协议版本
200——交易成功
201——提示知道新文件的 URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的 GET 请求
300——请求的资源可在多处得到
301——删除请求数据
302——在其他地址发现了请求数据
303——建议客户端访问其他 URL 或访问方式
304——客户端已经执行了 GET,但文件未变化
305——请求的资源必须从服务器指定的地址得到
306——前一版本 HTTP 中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除
400——错误请求,如语法错误
401——未授权
401.1 - 未授权:登录失败
401.2 - 未授权:服务器配置问题导致登录失败
401.3 - ACL 禁止访问资源
401.4 - 未授权:授权被筛选器拒绝
401.5 - 未授权:ISAPI 或 CGI 授权失败
402——保留有效 ChargeTo 头响应
403——禁止访问
403.1 - 禁止访问:禁止可执行访问
403.2 - 禁止访问:禁止读访问
403.3 - 禁止访问:禁止写访问
403.4 - 禁止访问:要求 SSL
403.5 - 禁止访问:要求 SSL 128
403.6 - 禁止访问:IP 地址被拒绝
403.7 - 禁止访问:要求客户证书
403.8 - 禁止访问:禁止站点访问
403.9 - 禁止访问:连接的用户过多
403.10 - 禁止访问:配置无效
403.11 - 禁止访问:密码更改
403.12 - 禁止访问:映射器拒绝访问
403.13 - 禁止访问:客户证书已被吊销
403.15 - 禁止访问:客户访问许可过多
403.16 - 禁止访问:客户证书不可信或者无效
403.17 - 禁止访问:客户证书已经到期或者尚未生效
404——没有发现文件、查询或 URl
405——用户在 Request-Line 字段定义的方法不允许
406——根据用户发送的 Accept ,请求资源不可访问
407——类似 401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址
411——服务器拒绝用户定义的 Content-Length 属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源 URL 长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含 Range 请求头字段,在当前请求资源范围内没有 range 指示值,请求也不包含 If-Range 请求头字段
417——服务器不满足请求 Expect 头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。
500 - 内部服务器错误
500.10 - 内部服务器错误 - ASP 错误
500.11 - 服务器关闭
500.12 - 应用程序重新启动
500.13 - 服务器太忙
500.14 - 应用程序无效
500.15 - 不允许请求 global.asa
501 - 未实现
502 - 网关错误