springMVC使用request.getInputStream()獲取流為空


---恢復內容開始---

如題,因為springMVC已經讀取過一次輸入流,所以在Controller再次獲取流為空

解決方法,先將RequestBody保存為一個byte數組,然后通過Servlet自帶的HttpServletRequestWrapper類覆蓋getReader()和getInputStream()方法,使流從保存的byte數組讀取。然后再Filter中將ServletRequest替換為ServletRequestWrapper。代碼如下:

 

1.下面為添加的過濾器,該過濾器放到web.xml最上面

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import com.sinosoft.sss.utils.MAPIHttpServletRequestWrapper;

public class HttpServletRequestReplacedFilter implements Filter  {
    @Override  
    public void destroy() {  
          
    }  
  
    @Override  
    public void doFilter(ServletRequest request, ServletResponse response,  
            FilterChain chain) throws IOException, ServletException {  
        
        ServletRequest requestWrapper = null;    
        if(request instanceof HttpServletRequest) {  
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            if("POST".equals(httpServletRequest.getMethod().toUpperCase())){
                requestWrapper = new MAPIHttpServletRequestWrapper((HttpServletRequest) request); 
            } 
        }

        if(requestWrapper == null) {    
            chain.doFilter(request, response);    
        } else {    
            chain.doFilter(requestWrapper, response);    //替換!
        }    
    }  
  
    @Override  
    public void init(FilterConfig arg0) throws ServletException {  
          
    }

}

2.web.xml文件

<filter>  
        <filter-name>requestFilter</filter-name>  
        <filter-class>com.sinosoft.sss.filter.HttpServletRequestReplacedFilter</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>requestFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  

3.覆蓋HttpServletRequestWrapper類getReader()和getInputStream()方法

import java.io.BufferedReader;  
import java.io.ByteArrayInputStream;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.nio.charset.Charset;  
  
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletRequestWrapper;  
  
import org.apache.commons.lang.StringUtils;  
  
public class MAPIHttpServletRequestWrapper extends HttpServletRequestWrapper {  
    private final byte[] body;    
      
    public MAPIHttpServletRequestWrapper(HttpServletRequest request)  
            throws IOException {    
        super(request);    
        body = readBytes(request.getReader(), "utf-8");  
    }    
    
    @Override    
    public BufferedReader getReader() throws IOException {    
        return new BufferedReader(new InputStreamReader(getInputStream()));    
    }    
    
    @Override    
    public ServletInputStream getInputStream() throws IOException {    
        final ByteArrayInputStream bais = new ByteArrayInputStream(body);    
        return new ServletInputStream() {    
    
            @Override    
            public int read() throws IOException {    
                return bais.read();    
            }

            @Override
            public boolean isFinished() {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public boolean isReady() {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public void setReadListener(ReadListener readListener) {
                // TODO Auto-generated method stub
                
            }    
        };    
    }   
      
    /** 
     * 通過BufferedReader和字符編碼集轉換成byte數組 
     * @param br 
     * @param encoding 
     * @return 
     * @throws IOException  
     */  
    private byte[] readBytes(BufferedReader br,String encoding) throws IOException{  
        String str = null,retStr="";  
        while ((str = br.readLine()) != null) {  
            retStr += str;  
        }  
        if (StringUtils.isNotBlank(retStr)) {  
             return retStr.getBytes(Charset.forName(encoding));  
        }  
        return null;  
    }  
      
}  

參考:http://www.cnblogs.com/ocean-sky/p/6899613.html

   http://www.cnblogs.com/csliwei/p/5557353.html 

 

---恢復內容結束---


免責聲明!

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



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