servlet和jsp核心编程(第2版)第五章客户请求的处理:HTTP请求报头学习笔记
第五章客户请求的处理:HTTP请求报头
核心方法:
1.在使用request.getHeader返回结果之前,一定要确保它不是null。
2.对于篇幅较长的文本页面,Gzip压缩可以极大第降低下载时间。
学习笔记:
一、请求报头的读取:1.调用HttpServletRequest的getHeader方法。在Http1.1中,只有Host是必需的。因而,在使用请求报头之前一定要检查是否为null。
请求的格式为:
<requestline>
<headerline>
<blankline>
[<requestbody>]
具体例子可参见http://wenku.baidu.com/view/31d9151a6bd97f192279e9d7.html
每种请求报头可见http://www.iteye.com/topic/563082
2.报头名称对大小写不敏感,尽管getHeader是读取输入报头的通用方式,但由于几种报头的应用太过普遍,故而HttpServletRequest为他们提供了专门的访问方法。
比如:getCookies,getAuthType,getRemoteUser;getContentLength,getContentType,getDateHeader,getIntHeader,getHeaders(返回一个Enumeration),getMethod,getRequestURI,getQueryString,getProtocol
二、枚举报头:
Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements){ String headerName = (String)headerNames.nextElement(); out.println(headerName+":"+request.getHeader(headerName)); }
三、了解HTTP1.1请求报头
四、发送压缩的web页面。
package coreservlets.beans; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; import java.util.zip.GZIPOutputStream; import java.io.IOException; public class GzipUtilities { public static boolean isGzipSupport(HttpServletRequest request){ boolean flag = false; String acceptEncoding = request.getHeader("Accept-Encoding"); if(acceptEncoding!=null&&acceptEncoding.indexOf("gzip")!=-1){ flag = true; } return flag; } public static boolean isGzipDisabled(HttpServletRequest request){ boolean flag = false; String param = request.getParameter("gzip"); if(param!=null&&!param.equalsIgnoreCase("false")){ flag = true; } return flag; } public static PrintWriter getGzipWriter(HttpServletResponse response) throws IOException{ return new PrintWriter(new GZIPOutputStream(response.getOutputStream())); } }
五、区分不同的浏览器类型。
User-Agent报头标示发出请求的具体浏览器。注意:1.仅在必要时使用User-Agent,2.检查是否为null,3.区分Netscape和IE,要检查“MSIE”,而非“Mozilla”。
String header = request.getHeader("User-Agent"); String title; if(header!=null&&header.indexOf("MSIE")!=-1){ title = "This is IE ;"; }else{ title = "This is Netscape;"; }
六、依据客户的到达方式定制页面
通过Referer报头,我们可以根据用户如何到达某个页面,对页面进行定制。这个Referer报头指出,用户单击连接到达当前页面时
所处的页面的位置,如果用户直接输入页面的地址,就不会发送这个Referer
String referer = request.getHeader("Referer"); if(referer==null){ doSomething(); } if(referer.index("JRun")!=-1){ doSomething(); }else if(referer.index("Resin")!=-1){ doSomething(); }else{ doSomething(); }
七、标准CGI变量的访问。CGI,传统公共网关接口(CommonGatewayInterface),在物理上是一段程序,运行在服务器上,
提供同客户端HTML页面的接口。这样说大概还不好理解。那么我们看一个实际例子:现在的个人主页上大部分都有一个留言本。
留言本的工作是这样的:先由用户在客户端输入一些信息,如名字之类的东西。接着用户按一下“留言”(到目前为止工作都在客
户端),浏览器把这些信息传送到服务器的CGI目录下特定的cgi程序中,于是cgi程序在服务器上按照预定的方法进行处理。在本
例中就是把用户提交的信息存入指定的文件中。然后cgi程序给客户端发送一个信息,表示请求的任务已经结束。此时用户在浏览
器里将看到“留言结束”的字样。整个过程结束。
尽管将不同的数据来源区分对待会更有意义些,但我们得到每个CGI变量在servlet中的等价物更为有用,