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中的等价物更为有用,

相关推荐