servlet和jsp核心编程(第2版)第五章客户请求的处理:HTTP请求报头学习笔记

第五章客户请求的处理:HTTP请求报头
核心方法
1.在使用request.getHeader返回结果之前,一定要确保它不是null。
2.对于篇幅较长的文本页面,Gzip压缩可以极大第降低下载时间。
学习笔记
、请求报头的读取: 1.调用HttpServletRequest的getHeader方法。在Http1.1中,只有Host是必需的。因而,在使用请求报头之前一定要检查是否为null。
请求的格式为:
<request line>
<header line>
<blank line>
[<request body>]
具体例子可参见 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,传统公共网关接口(Common Gateway Interface),在物理上是一段程序,运行在服务器上,

提供同客户端HTML页面的接口。这样说大概还不好理解。那么我们看一个实际例子:现在的个人主页上大部分都有一个留言本。

留言本的工作是这样的:先由用户在客户端输入一些信息,如名字之类的东西。接着用户按一下“留言”(到目前为止工作都在客

户端),浏览器把这些信息传送到服务器的CGI目录下特定的cgi程序中,于是cgi程序在服务器上按照预定的方法进行处理。在本

例中就是把用户提交的信息存入指定的文件中。然后cgi程序给客户端发送一个信息,表示请求的任务已经结束。此时用户在浏览

器里将看到“留言结束”的字样。整个过程结束。
尽管将不同的数据来源区分对待会更有意义些,但我们得到每个CGI变量在servlet中的等价物更为有用,

猜你喜欢

转载自hanazawakana.iteye.com/blog/1617745