学科分类
目录
Java Web

HTTP请求消息头

在HTTP请求消息中,请求行之后,便是若干请求消息头。请求消息头主要用于向服务器端传递附加消息,例如,客户端可以接收的数据类型、压缩方法、语言以及发送请求的超链接所属页面的URL地址等信息,具体示例如下:

Host: localhost:8080
Accept: image/gif, image/x-xbitmap, *
Referer: http://localhost:8080/itcast/
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB6.5; CIBA)
Connection: Keep-Alive
Cache-Control: no-cache

从上面的请求消息头中可以看出,每个请求消息头都是由一个头字段名称和一个值构成,头字段名称和值之间用冒号(:)和空格( )分隔,每个请求消息头之后使用一个回车换行符标志结束。需要注意的是,头字段名称不区分大小写,但习惯上将单词的第一个字母大写。

当浏览器发送请求给服务器时,根据功能需求的不同,发送的请求消息头也不相同,接下来,针对一些常用的请求头字段进行详细讲解。

1、Accept

Accept头字段用于指出客户端程序(通常是浏览器)能够处理的MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)类型。例如,如果浏览器和服务器同时支持png类型的图片,则浏览器可以发送包含image/png的Accept头字段,服务器检查到Accept头中包含image/png这种MIME类型,可能在网页中的img元素中使用png类型的文件。MIME类型有很多种,例如,下面的这些MIME类型都可以作为Accept头字段的值。

Accept: text/html,表明客户端希望接受html文本。
Accept: image/gif,表明客户端希望接受GIF图像格式的资源。
Accept: image/*,表明客户端可以接受所有image格式的子类型。
Accept: */*,表明客户端可以接受所有格式的内容。

关于MIME类型的相关知识,将在3.4.2小节的Content-Type头字段中进行详细讲解。

2、Accept-Charset

Accept-Charset头字段用于告知服务器端客户端所使用的字符集,具体示例如下:

Accept-Charset: ISO-8859-1

在上面的请求头中,指出客户端服务器使用ISO-8859-1字符集。如果想指定多种字符集,则可以在Accept-Charset头字段中将指定的多个字符集以逗号分隔,具体示例如下:

Accept-Charset: ISO-8859-1,unicode-1-1

需要注意的是,如果Accept-Charset头字段没有在请求头中出现,则说明客户端能接受使用任何字符集的数据。

如果Accept-Charset头出现在请求消息里,但是服务器不能发送采用客户端期望字符集编码的文档,那么服务器将发送一个406错误状态响应,406是一个响应状态码,表示服务器返回内容使用的字符集与Accept-Charset头字段指定的值不兼容,关于状态码的相关知识,将在后面的小节进行详细讲解。

3、Accept-Encoding

Accept-Encoding头字段用于指定客户端能够进行解码的数据编码方式,这里的编码方式通常指的是某种压缩方式。在Accept-Encoding头字段中,可以指定多个数据编码方式,它们之间以逗号分隔,具体示例如下:

Accept-Encoding: gzip,compress

在上面的头字段中, gzip和compress这两种格式是最常见的数据编码方式。在传输较大的实体内容之前,对其进行压缩编码,可以节省网络带宽和传输时间。服务器接收到这个请求头,它使用其中指定的一种格式对原始文档内容进行压缩编码,然后再将其作为响应消息的实体内容发送给客户端,并且在Content-Encoding响应头中指出实体内容所使用的压缩编码格式。浏览器在接收到这样的实体内容之后,需要对其进行反向解压缩。

需要注意的是,Accept-Encoding和Accept消息头不同,Accept请求头指定的MIME类型是指解压后的实体内容类型,Accept-Encoding消息头指定的是实体内容压缩的方式。

4、Accept-Language

Accept-Language头字段用于指定客户端期望服务器返回哪个国家语言的文档,它的值可以指定多个国家的语言,语言之间用逗号分隔,具体示例如下:

Accept-Language: zh-cn,en-us

在上述示例中,zh-cn代表中文(中国),en-us代表英语(美国),这些值大家不需要记忆。打开IE浏览器,选择【工具】à【Internet选项】à【语言】,在弹出的【语言首选项】窗口中可以看到“国家语言”的代号,如图1所示。

图1 IE浏览器语言首选项

如果想查看其它的国家语言代号,可以点击右边的【添加(A)】按钮,在弹出的【添加语言】窗口中查看,如图2所示。

img

图2 【添加语言】窗口

需要注意的是,浏览器会根据【语言首选项】窗口中语言列表的先后顺序,生成响应的Accept-Language消息头。在图1中,由于en-us在zh-cn前面,因此,浏览器生成的Accept-Language头如下所示:

Accept-Language: en-us,zh-cn

服务器只要检查Accept-Language请求头中的信息,按照其中设置的国家语言的先后顺序,首先选择返回位于前面的国家语言的网页文档,如果不能返回,则依次返回后面的国家语言的网页文档。

5、Authorization(授权)与Proxy-Authorization

当客户端访问受口令保护的网页时,Web服务器会发送401响应状态码和WWW-Authenticate响应头,要求客户端使用Authorization请求头来应答。根据WWW-Authenticate响应头指定的认证方式不同,Authorization请求头中的内容格式也不一样。WWW-Authenticate响应头指定的认证方式有两种:BASIC和DIGEST。对于BASIC认证方式,客户端需要把用户名和密码用“:”分隔,然后经过Base64编码之后传送给Web服务器。

例如:将用户名为Ann、密码为666888的用户信息“Ann:666888”进行Base64编码,形成的Authorization请求头字段内容如下所示:

Authorization: Basic QW5uOjY2Njg4OA ==

然而,使用Base64编码的数据很容易被解码,这实际上相当于是一种未加密的明文传送方式,装备了网络监视工具的计算机截获到该信息后,很容易破解出用户名和密码。

如果使用DIGEST认证方式,服务器首先向浏览器发送一些用于验证过程的信息及附加信息,浏览器将这些信息与用户名和密码以及某些其它信息进行混合后,再执行MD5加密算法,将得到的结果和附加信息一起以明文文本通过网络发送给服务器。服务器也使用与客户端一样的信息和附加信息,将它们和所保存的客户端密码执行散列算法,然后将计算结果和客户端的结果进行比较,只有这两个数字完全相同才允许访问。

Proxy-Authorization头字段的作用和用法与Authorization头字段基本相同,只不过Proxy-Authorization请求头是服务器端向代理服务器发送的验证信息。

6、Host

Host头字段用于指定资源所在的主机名和端口号,格式与资源的完整URL中的主机名和端口号部分相同,具体示例如下所示:

Host: www.itcast.cn:80

在上述示例中,由于浏览器连接服务器时默认使用的端口号为80,所以 “www.itcast.cn”后面的端口号信息“:80”可以省略。

需要注意的是,在HTTP1.1中,浏览器和其它客户端发送的每个请求消息中必须包含Host请求头字段,以便Web服务器能够根据Host头字段中的主机名来区分客户端所要访问的虚拟Web站点。当浏览器访问Web站点时,会根据地址栏中的URL地址自动生成相应的Host请求头。

7、If-Match

浏览器和代理服务器都可以缓存服务器回送的网页文档。当用户再次访问已缓存的页面时,只有网页内容已被更新,服务器才需要把该页面的内容重新回送到客户端,否则会通知浏览器访问本地缓存的页面,以减少不必要的网络传输流量。当服务器为客户端传送网页文件的内容时,可以传输一些代表实体内容特征的头字段,这些头字段被称为实体标签。当客户机再次向服务器请求这个网页文件时,可以使用If-Match头字段附带以前缓存的实体标签内容,这个请求被视为一个条件请求,例如:

If-Match: "repository"

其中,"repository"是客户端上次访问Web服务器中的该页面时,服务器使用ETag实体标签传送的内容,具体示例如下所示:

ETag: "repository"

服务器收到客户端的请求后,会检索If-Match头中的实体标签内容,并与服务器端的代表当前网页内容特征的实体标签内容进行比较。如果两者相同,则表示网页内容没有更改,Web服务器不返回网页文档,让客户端仍然使用以前缓存的网页文档。否则,服务器返回新的网页文件和新的实体标签内容头字段。

8、 If-Modified-Since

If-Modified-Since请求头的作用和If-Mach类似,只不过它的值为GMT格式的时间。If-Since-Modified请求头被视作一个请求条件,只有服务器中文档的修改时间比If-Modified-Since请求头指定的时间新,服务器才会返回文档内容。否则,服务器将返回一个304(Not Modified)状态码来表示浏览器缓存的文档是最新的,而不向浏览器返回文档内容,这时,浏览器仍然使用以前缓存的文档。通过这种方式,可以在一定程度上减少浏览器与服务器之间的通信数据量,从而提高了通信效率。

9、Range和If-Range

Range头字段用于指定服务器只需返回文档中的部分内容及内容范围,这对较大文档的断点续传非常有用。如果客户端在一次请求中只接收到服务器返回的部分内容就中断了,可以在第二次请求中,使用Range头字段要求服务器只返回中断位置以后的内容。Range头有以下几种使用格式:

(1) Range: bytes=1000-2000

(2) Range: bytes=1000-

(3) Range: bytes=-1000

在上面列举的三种格式中,第一种格式请求服务器返回文档中的第1000个字节到2000个字节之间的内容,包括第1000和第2000个字节的内容。第二种格式请求服务器返回文档中的第1000个字节以后的所有内容。第三种格式请求服务器返回文档中的最后1000个字节的内容。

If-Range头字段只能伴随着Range头字段一起使用,其设置值可以是实体标签或GMT格式的时间。如果设置值为实体标签,且该标签内容与服务器端代表当前网页内容特征的实体标签内容相同,则服务器按Range头的要求返回网页中的部分内容,否则,服务器返回当前网页的所有内容。如果设置值为GMT格式的时间,并且自从这个时间以来,服务器上保存的该网页文件没有发生修改,服务器会按Range头的要求返回网页中的部分内容,否则,服务器返回当前网页的所有内容。

10、Max-Forward

Max-Forward头字段指定当前请求可以途径的代理服务器数量,每经过一个代理服务器,此数值就减1。当Max-Forward请求头的值为0时,如果请求还没有到达最终的Web服务器,那么代理服务器将终止转发这个请求,由它来完成对客户机的最终响应。

11、Referer

浏览器向服务器发出的请求,可能是直接在浏览器中输入URL地址而发出,也可能是点击一个网页上的超链接而发出。对于第一种直接在浏览器地址栏中输入URL地址的情况,浏览器不会发送Referer请求头,而对于第二种情况,浏览器会使用Referer头字段标识发出请求的超链接所在网页的URL。例如本地Tomcat服务器的chapter03项目中有一个Html文件GET.html,GET.html中包含一个指向远程服务器的超链接,当点击这个超链接向服务器发送GET请求时,浏览器会在发送的请求消息中包含Referer头字段,如下所示:

Referer: http://localhost:8080/chapter03/GET.html

Referer头字段非常有用,常被网站管理人员用来追踪网站的访问者是如何导航进入网站的。同时Referer头字段还可以用于网站的防盗链。

什么是盗链呢?假设一个网站的首页中想显示一些图片信息,而在该网站的服务器中并没有这些图片资源,它通过在Html文件中使用img标记链接到其它网站的图片资源,将其展示给浏览者,这就是盗链。盗链的网站提高了自己网站的访问量,却加重了被链接网站服务器的负担,损害了其合法利益。所以,一个网站为了保护自己的资源,可以通过Referer头检测出从哪里链接到当前的网页或资源,一旦检测到不是通过本站的链接进行地访问,可以进行阻止访问或者跳转到指定的页面。

12. User-Agent

User-Agent中文名为用户代理,简称 UA,它用于指定浏览器或者其它客户端程序使用的操作系统及版本、浏览器及版本、浏览器渲染引擎、浏览器语言等,以便服务器针对不同类型的浏览器而返回不同的内容。例如,服务器可以通过检查User-Agent头,如果发现客户端是一个无线手持终端,就返回一个WML文档;如果客户端是一个普通的浏览器,则返回通常HTML文档。例如,IE浏览器生成的User-Agent请求信息如下:

User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)

在上面的请求头中,User-Agent头字段首先列出了Mozilla版本,然后列出了浏览器的版本(MSIE 8.0表示Microsoft IE 8.0)、操作系统的版本(Windows NT 5.1表示Windows XP)以及浏览器的引擎名称(Trident/4.0)。

点击此处
隐藏目录