---恢復內容開始---
如題,因為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
---恢復內容結束---
