美文网首页
JavaEE-HttpServletResponse总结

JavaEE-HttpServletResponse总结

作者: lioilwin | 来源:发表于2017-08-23 22:55 被阅读49次

    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

    相关文章

      网友评论

          本文标题:JavaEE-HttpServletResponse总结

          本文链接:https://www.haomeiwen.com/subject/dezjdxtx.html