http 的request和response 在servlet的应用文件下载

一)response

我们通过浏览器访问网站的时候,处理响应的是response。

它由三部门组成:响应行、响应头、响应体 作用:往浏览器写东西。

1)响应行

格式:协议/版本  状态码 状态码说明。

状态码:

  1xx 已发送请求。

       2xx  已完成响应  200 正常响应。

       3xx   还需浏览器进一步操作。

             302 重定向,配合响应头:location。

              304 读缓存。

       4xx  用户操作错误。

               404  用户操作错误。

                405   访问方法不存在。

        5xx

               500  服务器内部错误。

  常用方法:

      setStauts()该方法,设置http返回码的时候,如果返回的自定义的比如说111的状态码直接浏览器处于pending状态,4xx的返回码也会显示请求有问题等。

 1 @WebServlet(name = "Servlet_Rsq")
 2 public class Servlet_Rsq extends HttpServlet {
 3     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 4 
 5     }
 6 
 7     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 8         response.setContentType("text/html;charset=utf-8");
 9         response.setStatus(400);
10         response.getWriter().print("<h1>状态码400</h1>");
11     }
12 }

 

操作响应头:

    setHeader(String key,String val) addHeader(String  key,String val)设置相应头,如果存在则追加,如果不存在添加。

1         response.getWriter().print("<div>三秒之后进行跳转!</div>");
2         response.setHeader("refresh","3;url=/");

 常用响应头:

              1): 重定向建议使用第二种

                     1、location:需要注意必须配合setstatus()方法

1         response.setStatus(302);
2         response.setHeader("location","/local");

      2:sendRedirect()

1 response.sendRedirect("/local");

    2)文件下载

    1、超链接下载:之前我们在部署下载服务器的时候,直接使用超链接下载,但是有的类型文件,比如说:xml 在下载的时候,直接被打开。而有的zip包取能被下载,这是为什么呢?

之所以会被下载是因为:浏览器解析不了的文件,会被浏览器下载处理,如果可以被解析的文件的,则会在浏览器呈现出来。也就是文件的mintype类型问题。所以出现之前的情况。

       2、代码下载

               通过指定文件mimeType的类型,通过输入IO流和输出流,返回给浏览器可以直接被下载,不会被出现上面的问题。

    还有一个问题:文件名字中带有中文的时候,不同的浏览器需要编码不同。

    Firefox:需要的base64编码

              其他浏览器:需要utf-8

     1)获取文件的mimeType类型。

     2)设置头部信息。

     3)对拷流。

 1     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         String filename=request.getParameter("filename");
 3         System.out.println(filename);
 4         ServletContext context=this.getServletContext();
 5         String mi=context.getMimeType("/download/"+filename);
 6         System.out.println(mi);
 7         response.setContentType(mi);
 8         InputStream inp=context.getResourceAsStream("WEB-INF/download/time.jpg");
 9         //设置头部信息。
10         response.setHeader("content-disposition","attachment;filename="+filename);
11         ServletOutputStream out=response.getOutputStream();
12         //io对拷。使用common.io
13         IOUtils.copy(inp,out);
14     }

 二)request

  作用:获取浏览器的发送过来的数据。

        组成部分:

              请求行、请求头、请求体

       操作请求行:

               格式:

                       请求方式  请求资源  协议/版本

               常用方法: HttpServletRequest

                   掌握的方法:                

1         //获取请求方法:get、post等
2         String method=request.getMethod();
3         //获取远程执行IP
4         String ip=request.getRemoteAddr();
5         //获取项目名称。
6         String pro=request.getContextPath();
7         System.out.println(method+" "+ip+" "+pro);

   操作请求头:

1         //获取请求浏览器内核。
2         String nut=request.getHeader("user-agent");
3         //获取页面请求的来源 防盗链
4         String com=request.getHeader("referer");
5         System.out.println(nut+" "+com);

   获取单个key多个值情况(checkbox)

 1         //获取单个请求参数。
 2         String  finame=request.getParameter("filename");
 3         //获取多个请求参数的值。
 4         String[]  vals=request.getParameterValues("info");
 5         for(String i:vals){
 6             System.out.println(i);
 7         }
 8         //获取多组参数值。
 9         Map<String,String[]> get_val=request.getParameterMap();
10 //        System.out.println(get_val);
11         for(String key:get_val.keySet()){
12             System.out.println(Arrays.toString(get_val.get(key)));
13         }

三:

     get请求和post请求中文乱码,是因为在浏览器处理中文的时候utf8但是到tomcat使用的编码的是iso-8859-1。所以,我们需要转换相应的编码。

使用String   str=String.getBytes("iso-8859-1",“utf-8”)

因为得到参数已经被iso-8859-1处理过,需要用iso-8859-1解码然后用utf-8解码。new String(oldstring.getBytes("iso-8859-1"),"utf-8")

1         //获取多个请求参数的值。
2         String[]  vals=request.getParameterValues("info");
3         for(String i:vals){
4             System.out.println(new String(i.getBytes("iso-8859-1"),"utf-8"));
5         }

 下载文件扩展:

      针对带有中文的下载文件处理。针对不同的浏览器进行不同的处理

 1       String filename=request.getParameter("filename");
 2         filename=new String(filename.getBytes("iso-8859-1"),"utf-8");
 3         System.out.println(filename);
 4         String _filename;
 5         if(nut.contains("Firefox")){
 6              _filename=base64EncodeFileName(filename);
 7         }else{
 8              _filename= URLEncoder.encode(filename,"utf-8");
 9         }
10         System.out.println(_filename);
11         ServletContext context=this.getServletContext();
12         String mi=context.getMimeType("/download/"+filename);
13         System.out.println(mi);
14         response.setContentType(mi);
15         //获取输入的流的时候需要注意的是:原始的文件名字 需要转码处理。
16         InputStream inp=context.getResourceAsStream("WEB-INF/download/"+filename);
17         //设置头部信息。
18         //添加不同的转码的文件名字。
19         response.setHeader("content-disposition","attachment;filename="+_filename);
20         ServletOutputStream out=response.getOutputStream();
21         //io对拷。使用common.io
22         IOUtils.copy(inp,out);
23     }
24 
25     public static String base64EncodeFileName(String fileName) {
26         /**
27          * 该函数主要处理判断请求的浏览器内核进行处理。
28          * 针对不同的浏览器内核,进行不同转码。
29          */
30         BASE64Encoder base64encoder = new BASE64Encoder();
31         try {
32             return "=?UTF-8?B?" + new String(base64encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
33         } catch (java.io.UnsupportedEncodingException e) {
34             e.printStackTrace();
35             throw new RuntimeException(e);
36         }
37     }
38 
39 }
原文地址:https://www.cnblogs.com/evilliu/p/8570107.html