HTTP协议和tomcat中的HTTP实现(二)

4.3、通用信息头(普通报头)

Cache-Control  

用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma

请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-storemax-agemax-stalemin-freshonly-if-cached;

响应时的缓存指令包括:publicprivateno-cacheno-storeno-transformmust-revalidateproxy-revalidatemax-ages-maxage

eg

为了指示IE浏览器(客户端)不要缓存页面,服务器端的JSP程序可以编写如下:

response.sehHeader("Cache-Control","no-cache");

//response.setHeader("Pragma","no-cache");作用相当于上述代码,通常两者合用

这句代码将在发送的响应消息中设置普通报头域:Cache-Control:no-cache

 

Date

普通报头域表示消息产生的日期和时间。例如,Date:Mon,31Dec200104:25:57GMTDate描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。

 

Connection

普通报头域允许发送指定连接的选项。例如指定连接是连续“Keep-Alive”,或者“close”选项。“close”选项会通知服务器,在响应完成后,关闭连接。

如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1HTTP 1.1默认进行持久连接),就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。也就是当有新的图片请求时,不用创建新的tcp连接(每一个新的tcp连接的建立都要经过三次握手,会消耗一定的时间),而在持久连接中处理请求。从socket编程方面来说,就是在已建立的socket连接中,又进行一次一边写,一边读取的操作。

 

4.4、请求报头

Accept

请求报头域用于指定客户端接受哪些类型的信息,即MIME类型。egAcceptimage/gif,表明客户端希望接受GIF图象格式的资源;Accepttext/html,表明客户端希望接受html文本。

 

Accept-Charset

请求报头域用于指定客户端接受的字符集。egAccept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

 

Accept-Encoding

请求报头域类似于Accept,但是它是用于指定可接受的内容编码。egAccept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。 Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少510倍的下载时间。

 

Accept-Language

请求报头域类似于Accept,但是它是用于指定一种自然语言。egAccept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。

 

Authorization

请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。

 

Cookie

这是最重要的请求头信息之一。

 

Host

请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,eg

我们在浏览器中输入:http://www.guet.edu.cn/index.html

浏览器发送的请求消息中,就会包含Host请求报头域,如下:

Hostwww.guet.edu.cn

此处使用缺省端口号80,若指定了端口号,则变成:Hostwww.guet.edu.cn:指定端口号

 

If-Modified-Since

只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304Not Modified”应答。

 

Pragma

指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。

 

Referer

包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。

 

User-Agent

浏览器类型。

我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了。

 

UA-PixelsUA-ColorUA-OSUA-CPU

由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

 

请求报头举例:

GET /form.html HTTP/1.1 (CRLF)

Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)

Accept-Language:zh-cn (CRLF)

Accept-Encoding:gzip,deflate (CRLF)

If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)

If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)

User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)

Host:www.guet.edu.cn (CRLF)

Connection:Keep-Alive (CRLF)

(CRLF)

 

4.5、响应报头

Location

响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponsesendRedirect方法,该方法同时设置状态代码为302

 

Server

包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是 Server响应报头域的一个例子:

ServerApache-Coyote/1.1

 

WWW-Authenticate

响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。

egWWW-Authenticate:Basic realm="Basic Auth Test!"  //可以看出服务器对请求资源采用的是基本验证机制。

 

4.6、实体报头

Allow

服务器支持哪些请求方法(如GETPOST等)。

 

Content-Encoding

文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。JavaGZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的NetscapeWindows上的IE 4IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。

 

Content-Language

实体报头域描述了资源所用的语言类型。没有设置该域则认为实体内容将提供给所有的语言阅读 egContent-Language:zh-cn

 

Content-Length

实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。

只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。

 

Content-Location

表示客户应当到哪里去提取文档,例如:http://www.dfdf.org/dfdf.html

 

Content-MD5

MD5 实体的一种MD5摘要,用作校验和。发送方和接受方都计算MD5摘要,接受方将其计算的值与此头标中传递的值进行比较。Eg1Content-MD5: <base64 of 128 MD5 digest>Eg2dfdfdfdfdfdfdff==

 

Content-Range

随部分实体一同发送;标明被插入字节的低位与高位字节偏移,也标明此实体的总长度。Eg1Content-Range: 1001-2000/5000eg2bytes 2543-4532/7898

 

Content-Type

实体报头域用语指明发送给接收者的实体正文的MIME类型。

Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType 可在web.xml文件中配置扩展名和MIME类型的对应关系。

Egtext/html; charset=GB2312  主类型/子类型。

 

Expires

实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。egExpiresThu15 Sep 2006 16:23:12 GMT

HTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期。eg:为了让浏览器不要缓存页面,我们也可以利用Expires实体报头域,设置为0jsp中程序如下:response.setDateHeader("Expires","0");

 

Last-Modified

实体报头域用于指示资源的最后修改日期和时间。

客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。例如:Last-ModifiedTue, 06 May 2008 02:42:43 GMT

 

Refresh

表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGIServletHTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,而不是“每隔N秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但NetscapeIE都支持它。

 

4.7、扩展头

HTTP消息中,也可以使用一些再HTTP1.1正式规范里没有定义的头字段,这些头字段统称为自定义的HTTP头或者扩展头,他们通常被当作是一种实体头处理。

 

现在流行的浏览器实际上都支持Cookie,Set-Cookie,RefreshContent-Disposition等几个常用的扩展头字段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值