HttpServetRequest讀取body只能一次的問題


HTTP請求中的是字符串數據:

 1 //字符串讀取
 2  
 3 void charReader(HttpServletRequest request) {
 4     BufferedReader br = request.getReader();
 5     String str, wholeStr = "";
 6     while((str = br.readLine()) != null){
 7        wholeStr += str;
 8     }
 9     System.out.println(wholeStr);
10 }
11 //二進制讀取
12  
13 void binaryReader(HttpServletRequest request) {
14      int len = request.getContentLength();
15      ServletInputStream iii = request.getInputStream();
16      byte[] buffer = new byte[len];
17      iii.read(buffer, 0, len);
18 }

注意:

request.getInputStream();   request.getReader();  和request.getParameter("key");

這三個函數中任何一個函數執行一次后(可正常讀取body數據),之后再執行就無效了。

 

解決方法: 包裝HttpServletRequest對象,緩存body數據,再次讀取的時候將緩存的值寫出

 1 package com.nd.sdp.formatastic.common.interceptor;
 2 
 3 import javax.servlet.ServletInputStream;
 4 import javax.servlet.http.HttpServletRequest;
 5 import javax.servlet.http.HttpServletRequestWrapper;
 6 import java.io.*;
 7 
 8 /**
 9  * @author weihainan.
10  * @since 0.1 created on 2017/2/23.
11  */
12 public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
13 
14     private final String body;
15 
16     public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
17         super(request);
18         StringBuilder stringBuilder = new StringBuilder();
19         BufferedReader bufferedReader = null;
20         try {
21             InputStream inputStream = request.getInputStream();
22             if (inputStream != null) {
23                 bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
24                 char[] charBuffer = new char[128];
25                 int bytesRead = -1;
26                 while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
27                     stringBuilder.append(charBuffer, 0, bytesRead);
28                 }
29             } else {
30                 stringBuilder.append("");
31             }
32         } catch (IOException ex) {
33             throw ex;
34         } finally {
35             if (bufferedReader != null) {
36                 try {
37                     bufferedReader.close();
38                 } catch (IOException ex) {
39                     throw ex;
40                 }
41             }
42         }
43         body = stringBuilder.toString();
44     }
45 
46     @Override
47     public ServletInputStream getInputStream() throws IOException {
48         final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
49         ServletInputStream servletInputStream = new ServletInputStream() {
50             public int read() throws IOException {
51                 return byteArrayInputStream.read();
52             }
53         };
54         return servletInputStream;
55     }
56 
57     @Override
58     public BufferedReader getReader() throws IOException {
59         return new BufferedReader(new InputStreamReader(this.getInputStream()));
60     }
61 
62     public String getBody() {
63         return this.body;
64     }
65 }

 

使用Filter替換HttpServletRequest對象

 1 package com.nd.sdp.formatastic.common.interceptor;
 2 
 3 import javax.servlet.*;
 4 import javax.servlet.annotation.WebFilter;
 5 import javax.servlet.http.HttpServletRequest;
 6 import java.io.IOException;
 7 
 8 /**
 9  * @author weihainan.
10  * @since 0.1 created on 2017/2/23.
11  */
12 @WebFilter(filterName = "httpServletRequestWrapperFilter", urlPatterns = "/*")
13 public class HttpServletRequestWrapperFilter implements Filter {
14 
15     @Override
16     public void init(FilterConfig filterConfig) throws ServletException {
17 
18     }
19 
20     @Override
21     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
22             throws IOException, ServletException {
23 
24         ServletRequest requestWrapper = null;
25         if (request instanceof HttpServletRequest) {
26             requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
27         }
28         if (null == requestWrapper) {
29             chain.doFilter(request, response);
30         } else {
31             chain.doFilter(requestWrapper, response);
32         }
33 
34     }
35 
36     @Override
37     public void destroy() {
38 
39     }
40 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM