本章研究以下内容:
1.HTTP请求报头的读取
2.构建所有的请求报头的表格
3.了解各种请求报头
4.压缩页面减少请求时间
5.区分不同的浏览器类型
6.依据客户的到达方式定制页面
7.标准CGI变量的访问
*注意
HTTP请求报头不等同于表单数据,表单数据的直接来源于用户的输入,对于get请求,这些数据是URL的一部分,对于POST请求,这些数据在单独的行中
相应的,HTTP请求报头由浏览器间接设定,并紧跟在初始的GET或者POST请求行之后发送。
eg:给出一个HTTP请求如下
某用户向位于http://www.somebookstore.com/servlet/Search的servlet提交书籍搜索请求产生的。
GET / servlet /Search?keyword = Servlets + jsp HTTP/1.1
Accept : image / gif , image 、jpg , */*
Accept - Encodeing : gzip
Connection : keep—alive
cookie : userID = id456789
Host : www.somebookestore .com
Referer : http://www.somebookstore.com/findbookes.html
User_Agent : Mozilla / 4.0 (compatible;MSIZE 6.0 ; WIndows NT 5.0)
1.请求报头的读取
调用HttpServletRequest的getHeader方法(*这是读取输入报头的通用方式)
eg: request.getHeader(“connection”);//注意,报头名称对大小写不敏感
尽管getHeader是读取输入报头的通用方式,但由于几种报头的应用太过于频繁,故而HttpServletRequest为他们提供了专门的访问方法
getCookies方法
getCookies方法返回的是Cookie报头的内容,这些内容在分析后存储在cookie对象构成的数组中。
getAuthType和getRemoteUser
getAuthType和getRemoteUser方法对Authorization报头进行拆分,分解它的各个构成部分
getContentType
getContentType方法返回的Content-Type报头的值(返回一个String值)
getContentLength
getContentLength方法返回Content-length报头的值(作为一个int值返回)
getDateHeader和getIntHeader
getDateHeader和getIntHeader方法读取指定的报头,然后分别将它们转化成Date和int值
getHeaderNames
除了查找特定的报头之外,还可以使用getHeaderNames方法得到一个Enumeration,枚举当前特定请求中所用的报头名称
getHeaders
大多数情况下,每个报头名称在请求中只出现一次,然而,报头偶尔也有出现多次的情况,每次出现取出各自的值,Accept-Language就是一个案例。你可以使用get
Headers获取一个Enumeration,枚举报头每次出现所对应的位置
最后除了查找请求的报头之外,您还可以获取主请求自身的信息,即:上面给出的例子的第一行的信息,同样使用的是HttpServletRequest中提供的方法
下面是对4中主要的方法的汇总:
getMethod
getMethod方法返回主请求方法(一般是GET或者是POST,单也可能是HEAD,PUT和DELETE)
getRequestURI
getRequestURI方法返回URI中主机和端口之后,但是表单数据之前的部分。以URL:http://randomhost.com/servlet/search.BookSearch?subject=jsp为例
执行此方法返回的结果是:"/servlet/search.BookSearch"
getQueryString
getQueryString方法返回表单数据。同样以URL:http://randomhost.com/servlet/search.BookSearch?subject=jsp为例
执行此方法返回的结果是:“subject=jsp”
getProtocol
getProtocol方法返回请求行的第三部分,一般为:HTTP/1.0或者为HTTP/1.1
Servlet一般在指定专用于HTTP1.1的响应报头后之前检查getProtocol
2.制作所有请求报头的表格
3.了解HTTP1.0请求报头
对请求报头的访问,使得Servlet能够执行许多优化,并提供大量的特性,如果不能访问请求报头,要实现这些特性是不可能的。
Accept
这个报头指定了浏览器能或者其他的客户端程序能够处理的MIME类型。
那些能够以多种格式返回资源的servlet,可以检查Accept来确定应该使用那种格式。
eg:png格式的图片比gif格式的图片在压缩上具有一定的优势,但是不是所有的浏览器都支持png格式。如果您同时拥有同一种图像的两只格式,您的servlet可以调用request.getHeader(“Accept”);,检查image/png,如果找不到匹配项,则在生成的所有IMG元素中使用blah.png文件名。否则,就只能使用blah,gif
Accept-Charset
这个报头标明了浏览器可以使用的字符集(utf-8)
Accept-encodeing
这个报头详细的列出了客户端能够处理的编码类型,如果服务器接收到了这个报头,则可以自由的使用任何一种所列出的格式对页面进行编码(一般为了减低传输时间),同时发送Content-Encodeing相应报头来表明页面的编码方式。这个编码类型安全不同于实际文档的MIME类型(在Content-Type响应报头中指明),因为在浏览器确定如何处理这个内容之前这个编码的风格是保留的。从另一个方面说,如果使用的是浏览器不能理解的编码,则显示的编码也是不可理解的。因此,在使用任何类型的内容编码之前,一定要明确的检查Accept-Encodeing报头。gzip或compress是二种最常见的值
在返回页面之前对他们进行压缩是一项有价值的服务。因为,一般说来,花在解码上的开销要小于在传输时间上的节省。
Accept-Language
这个报头,在servlet能够以多种语言生成结果树,列出客户端程序首选的语言
Authorization
在访问密码保护时的web页面时,客户用这个报头来标志自己的身份。
Connetion
这个报头标明了客户是否能够处理持续的HTTP连接。持续性的连接允许客户或者其他练篮球在单个socket中读取多个文件(例如,HTML文i件及相关的几幅图像)
从而,节省协商几个独立连接的所需的开销。使用HTTP1,1请求时,持续性的连接是默认选项,如果使用旧式风格的连接,客户必须将这个包头的的值指定为持续性连接:servlet