读取报头比较简单,使用HttpServletRequest的getHeader方法。如果当前请求中提供了指定的报头,则返回一个String,否则返回null。
注: 在使用请求报头前一定要检查是否为null!
这章一开头讲述了很多报头,我一时摸不着头脑了,Http协议我又不怎么熟悉,所以这里就比较困难,反复的看了很久也不是很明白,会读文字是没用的。所以还是先放一下向后进行吧!
Gzip压缩:
这个词是第一次听到,5.4中主要讲这个,大体上就是说在服务器端生成的Html页面,先进行压缩,再将压缩后的文件发送到客户端,由客户的浏览器将这个文件解压缩,再生成html文件。由于纯文本的Html文件的可压缩性很大,所以向客户着发送的压缩文件比一个html文件要小很多,书中说的是300倍。这样采用这种技术用户访问一个页面的总时间=服务端压缩+传送+客户端解压,虽然需要至少三步骤但比直接下载html页面还是要快很多的。
手动录入完并调试成功一个例子后渐渐的明白了,原来浏览器在请求页面访问时会携带着一些信息,当然这其中就有介绍到的报头,利用这些信息servlet可以判断客户端浏览器是否支持Gzip。(报头就像一个HashTable里面有字段和对应值 ,这些字段是根据HTTP协议规定出来的,这样理解应该是对的吧?!)例子记录一下:
类GzipUtility:
isGzipSupported方法用来判断客户端浏览器是否支持Gzip,Accept-Encoding就是Http协议中定义的一个报头了,如果这个客户端请求了这个报头,并且报头中存在字符串“gzip”就证明可以支持。
isGzipDisabled方法用来判断是否要使用Gzip,disableGzip是客户端浏览器提交访问时URL中的一个参数,可以是如下这样:http://xx.com/Servlet/Long?disableGzip=true 参数disableGzip说明需要使用Gzip。如果disableGzip的值为false,则根据代码可知不需要使用gzip,即由下面的方法返回一下正常的PrintWriter实例。
getGzipWriter方法将返回一个由PrintWriter封装的一个实例,并且指明Accept-Encoding响应报头的值为gzip。
LongServlet.java:
代码中用到了一个类ServletUtility,这是上一章中的可重用的代码:
这个页面以压缩格式通过网络发送,并由浏览器自动重建,从而节省了大量的下载时间。
看完了这一章后完全明白了报头了,整理了一下各个报头的功能:
- Accept:指定浏览器或其它客户程序能够处理的MIME(多媒体文件格式)类型
- *Accept-Charset:标明浏览器可以使用的字符集
- *Accept-Encoding:详细列出了客户端能够处理的编码类型
- Accept-Language:在Servlet能够以多种语言生成结果时,列出客户端程序首选语言
- Authorization:在访问密码保护的Web页面时,客户端用这个报头来标识自己的微分
- Connection:标明客户是否能够处理连续必的HTTP连接
- ^Content-Length:只适用于POST请求,用来给定POST数据的大小,以字节为单位
- Cookie:向服务器返回Cookie,这些cookie是之前服务器发送给浏览器的
- Host:标明原始Url中给出的主机名和端口号
- ^if-Modified-Since:仅当页面在指定的日期之后发生改变的情况下,客户端程序才希望获取该页面
- ^if-Unmodified-Since:与if-Modified-Since相反,仅当文档比指定日期时间要旧时,操作才继续
- Referer:用户单击链接到达当前页面,如果用户直接输入页面地址,浏览器不会发送Referer
- *User-Agent:标识生成请求的浏览器或直接客户端程序
^为很少显示的使用,*常用