JavaEE-HttpServletResponse总结

2017-08-23  本文已影响49人  lioilwin

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

上一篇下一篇

猜你喜欢

热点阅读