HttpServletResponse
設(shè)置狀態(tài)碼和響應(yīng)頭
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); //設(shè)置狀態(tài)碼 302
response.setHeader("Location", "http://lioil.win"); //設(shè)置響應(yīng)頭 Location
//重定向簡化版
response.sendRedirect("http://lioil.win");
1.字符編碼
1)字節(jié)流輸出
response.setContentType("text/html;charset=utf-8"); //設(shè)置瀏覽器字符解碼
response.getOutputStream().write("中文".getBytes("utf-8")); //設(shè)置服務(wù)器字符編碼
2)字符流輸出
response.setContentType("text/html;charset=utf-8"); //設(shè)置瀏覽器字符解碼
response.setCharcterEncoding("utf-8"); //設(shè)置服務(wù)器字符編碼(在setContentType中已實現(xiàn),可省略)
response.getWriter().write("中文");
注:
setContentType("text/html;charset=utf-8") = setHeader("content-type", "utf-8") + setCharcterEncoding("utf-8")
getOutputStream()和getWriter()互斥,尤其在forward()轉(zhuǎn)發(fā)前后要一致
* 在HTML文檔模擬HTTP響應(yīng)頭
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
2.文件下載
// 設(shè)置Http響應(yīng)頭 Content-Disposition, Http頭部只傳輸ASCII碼字符, 用URLEncoder轉(zhuǎn)碼成十六進(jìn)制字符
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"); //設(shè)置Http響應(yīng)頭refresh定時刷新
response.getWriter().write("注冊成功!3秒后回到主頁...");
* 在HTML文檔模擬HTTP響應(yīng)頭
<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是絕對時間,要求客戶端與服務(wù)器時間一致(無法保證,不建議使用,建議用Cache-Control)
response.setDateHeader("Expires", System.currentTimeMillis()+3600*1000L);
response.setHeader("Cache-Control", "max-age = 3600");
* 在HTML文檔模擬HTTP響應(yīng)頭
<meta http-equiv="expires" content="-1">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Pragma" content="no-cache">
B.瀏覽器緩存是否最新(需要瀏覽器再次請求確認(rèn))
// 服務(wù)器在HTTP響應(yīng)頭中 Last-Modified 或 ETag 傳給瀏覽器保存
// 瀏覽器在HTTP請求頭中 If-Modified-Since 或 If-None-Match 傳給服務(wù)器, 若時間或標(biāo)記一致, 則服務(wù)器返回狀態(tài)碼: 304 Not Modified
response.setDateHeader("Last-Modified", System.currentTimeMillis()); // 數(shù)據(jù)的修改時間(配合HTTP請求頭 If-Modified-Since)
response.setHeader("ETag", "1"); // 數(shù)據(jù)的修改標(biāo)記(配合HTTP請求頭 If-None-Match)
緩存優(yōu)先級: ETag > Last-Modified (通過修改時間來確認(rèn)是否最新,Last-Modified有一定的局限性)
簡書: http://www.reibang.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