JavaEE-HttpServletResponse总结

HttpServletResponse

设置状态码和响应头
	void setStatus(int st)
	void sendError(int sc)
	void setHeader(String name, String value)	
	void addHeader(String name, String value)

请求重定向(302 + Location)
	response.setStatus(302); //设置状态码 302				
	response.setHeader("Location", "http://lioil.win"); //设置响应头 Location
	
	//重定向简化版
	response.sendRedirect("http://lioil.win");

1.字符编码

1)字节流输出		
	response.setContentType("text/html;charset=utf-8");         //设置浏览器字符解码
	response.getOutputStream().write("中文".getBytes("utf-8")); //设置服务器字符编码

2)字符流输出	
	response.setContentType("text/html;charset=utf-8"); //设置浏览器字符解码
	response.setCharcterEncoding("utf-8");              //设置服务器字符编码(在setContentType中已实现,可省略)
	response.getWriter().write("中文");
	
注: 
	setContentType("text/html;charset=utf-8") = setHeader("content-type", "utf-8") + setCharcterEncoding("utf-8")
	getOutputStream()和getWriter()互斥,尤其在forward()转发前后要一致

* 在HTML文档模拟HTTP响应头
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>

2.文件下载

// 设置Http响应头 Content-Disposition, Http头部只传输ASCII码字符, 用URLEncoder转码成十六进制字符
response.setContentType("image/jpeg;);
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("中文.jpg", "utf-8"));
InputStream in = getServletContext().getResourceAsStream("中文.jpg"));
byte[] buffer = new byte[1024];
int len = 0;
while((len=in.read(buffer))!=-1)
	response.getOutputStream().write(buffer,0,len);
response.getOutputStream().flush();
in.close();

3.定时刷新

response.setContentType("text/html;charset=utf-8");
response.setHeader("refresh", "3;url=http://lioil.win"); //设置Http响应头refresh定时刷新
response.getWriter().write("注册成功!3秒后回到主页...");

* 在HTML文档模拟HTTP响应头
	<meta http-equiv="refresh" content="3;url=http://lioil.win">

4.浏览器缓存

A.浏览器缓存的有效期
	// 控制浏览器不使用缓存,一般都使用以下三个头,兼容不同浏览器
	response.setIntHeader("Expires", -1); //0或-1表示不缓存
	response.setHeader("Cache-Control", "no-cache");
	response.setHeader("Pragma", "no-cache");
	 
	// 浏览器缓存1小时, Expires是绝对时间,要求客户端与服务器时间一致(无法保证,不建议使用,建议用Cache-Control)
	response.setDateHeader("Expires", System.currentTimeMillis()+3600*1000L);
	response.setHeader("Cache-Control", "max-age = 3600");
	
	* 在HTML文档模拟HTTP响应头
		<meta http-equiv="expires" content="-1">
		<meta http-equiv="Cache-Control" content="no-cache">
		<meta http-equiv="Pragma" content="no-cache">
	
B.浏览器缓存是否最新(需要浏览器再次请求确认)
	// 服务器在HTTP响应头中 Last-Modified 或 ETag 传给浏览器保存
	// 浏览器在HTTP请求头中 If-Modified-Since 或 If-None-Match 传给服务器, 若时间或标记一致, 则服务器返回状态码: 304 Not Modified   
	response.setDateHeader("Last-Modified", System.currentTimeMillis()); // 数据的修改时间(配合HTTP请求头 If-Modified-Since) 
	response.setHeader("ETag", "1");                                     // 数据的修改标记(配合HTTP请求头 If-None-Match)
	
	缓存优先级: ETag > Last-Modified (通过修改时间来确认是否最新,Last-Modified有一定的局限性)

简书: http://www.jianshu.com/p/c77022355847
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54628760
GitHub博客:http://lioil.win/2017/01/20/HttpServletResponse.html
Coding博客:http://c.lioil.win/2017/01/20/HttpServletResponse.html