zoukankan      html  css  js  c++  java
  • Servlet中Response的用法和API

    1.概述
    --response对象表示web服务器给浏览器返回的响应信息
    --作用:开发人员可以使用response对象的方法,设置要返回给浏览器的响应信息

    2.Response体系结构

    ServletResponse 接口
            |
    HttpServletResponse 接口
            |
    org.apache.catalina.connector.ResponseFacade 实现类(由tomcat提供的)            

    3.设置Http响应消息

    --响应行

    * 格式
      协议/版本号 状态码
    * 例如
      HTTP/1.1 200
    * API
      1.设置状态码
      void setStatus(int sc)

    --响应头

    * 格式
      响应头名称:响应头的值
    * 例如
      Location:http://www.itcast.cn
    * API
      1.设置指定名称响应头的值
      void setHeader(String name,String value)

    --响应体

    * API(输出流对象)
      1.字符输出流
      PrintWriter getWriter()
      2.字节输出流
      ServletOutputStream getOutputStream()
      注意:在同一个Servlet,二种输出流不能同时使用,产生互斥

    --响应重定向

    方式一
    // 1.设置状态码
      response.setStatus(302);
    // 2.设置响应头
      response.setHeader("Location","/项目地址/资源地址");
    方式二【推荐】
      // response提供了专门负责重定向的方法
      response.sendRedirect("/项目地址/资源地址");

    特点

    1. 地址会发生改变
    2. 重定向是二次请求(不能使用request来共享数据)
    3. 重定向是浏览器行为,可以跳转到到服务器外部资源...

    --解决中文乱码

    * 方式一(了解)
    // 指定服务器响应中文的编码方式
      response.setCharacterEncoding("GBK");
    * 方式二(掌握)
    // 统一服务器和客户端的编码方式
      response.setContentType("text/html;charset=utf-8");

    4.文件下载

    1. 被下载文件的字节输入流
       FileInputStream        
    2. response字节输出流
       ServletOutputStream     
    3. 告知客户端下载文件的MIME类型
       Content-Type:MIME类型
    4. 告知浏览器以附件的方式保存
       Content-Disposition:attachment;filename=文件名
    //  1.接收请求参数 filename
    String filename = request.getParameter("filename");
    //  2.获取该文件真实路径,封装字节输入流
    ServletContext servletContext = getServletContext();
    String realPath = servletContext.getRealPath("/download/" + filename);
    FileInputStream in = new FileInputStream(realPath);
    //  3.告诉浏览器下载文件的MIME类型 Content-Type
    String mimeType = servletContext.getMimeType(filename);
    response.setContentType(mimeType);
    //  4.告诉浏览器以附件形式保存 Content-Disposition
    response.setHeader("Content-Disposition", "attachment;filename=" + filename);
    //  5.获取response的字节输出流
    ServletOutputStream out = response.getOutputStream();
    //  6.IO流的拷贝
    byte[] b = new byte[4096]; // 4KB
    int len = -1;
    while ((len = in.read(b)) != -1) {
       out.write(b, 0, len);
    }
    //  7.释放资源
    out.close();
    in.close();

    解决不同浏览器兼容,传入user-Agent请求头信息和文件参数名

    public static String getName(String agent, String filename) throws UnsupportedEncodingException {
            if (agent.contains("Firefox")) {
                // 火狐浏览器
                BASE64Encoder base64Encoder = new BASE64Encoder();
                filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
            } else {
                // 其它浏览器
                filename = URLEncoder.encode(filename, "utf-8");
            }
            return filename;
    }
  • 相关阅读:
    HTML基础
    一次由任意文件漏洞开始的渗透测试过程
    谈一谈信息泄露这件事
    浅谈任意文件下载漏洞的利用
    [原创] 一次渗透测试过程--从外网进内网
    一次绕过360+诺顿的提权过程
    漏洞挖掘高级方法
    新型勒索软件Magniber正瞄准韩国、亚太地区开展攻击
    Microsoft Edge 浏览器远程代码执行漏洞POC及细节(CVE-2017-8641)
    Office远程代码执行漏洞CVE-2017-0199复现
  • 原文地址:https://www.cnblogs.com/xiaozhang666/p/13366850.html
Copyright © 2011-2022 走看看