解決spring 處理request.getInputStream()輸入流只能讀取一次問題
一般我們會在InterceptorAdapter攔截器中對請求進行驗證
正常普通接口請求,request.getParameter()可以獲取,能多次讀取
如果我們的接口是用@RequestBody來接受數(shù)據(jù),那么我們在攔截器中
需要讀取request的輸入流 ,因為 ServletRequest中getReader()和getInputStream()只能調(diào)用一次
這樣就會導致controller 無法拿到數(shù)據(jù)。
解決方法 :
1、自定義一個類 BodyReaderHttpServletRequestWrapper.java
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.springframework.util.StreamUtils;
/**
* @author WBG
* @date 2020/6/22 10:42
* @describe
*/
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper{
private byte[] requestBody = null;//用于將流保存下來
public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
requestBody = StreamUtils.copyToByteArray(request.getInputStream());
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody);
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bais.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
};
}
@Override
public BufferedReader getReader() throws IOException{
return new BufferedReader(new InputStreamReader(getInputStream()));
}
}
2、自定義 MyFilter 繼承Filter
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
/**
* @author WBG
* @date 2020/6/22 14:32
* @describe
*/
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("開始");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
ServletRequest requestWrapper=null;
if(request instanceof HttpServletRequest) {
requestWrapper=new BodyReaderHttpServletRequestWrapper((HttpServletRequest)request);
}
if(requestWrapper==null) {
chain.doFilter(request, response);
}else {
System.out.println("------------------------------請求報文----------------------------------");
System.out.println(getParamsFromRequestBody((HttpServletRequest) requestWrapper));
System.out.println("------------------------------請求報文----------------------------------");
chain.doFilter(requestWrapper, response);
}
}
/* *
* 獲取請求體內(nèi)容
* @return
* @throws IOException
*/
private String getParamsFromRequestBody(HttpServletRequest request) throws IOException {
BufferedReader br = null;
String listString = "";
try {
br = request.getReader();
String str = "";
while ((str = br.readLine()) != null) {
listString += str;
}
} catch (IOException e) {
e.printStackTrace();
}
return listString;
}
@Override
public void destroy() {
System.out.println("destroy");
}
}
3、web.xm配置過濾器
<!--定義過濾器--> <filter> <!--定義過濾器攔截URL地址--> <filter-name>test2</filter-name> <!--過濾器的文件--> <filter-class>com.zhhy.hy2000interface.utils.filter.MyFilter</filter-class> </filter> <filter-mapping> <!--過濾器的名稱--> <filter-name>test2</filter-name> <!--過濾器負責攔截的URL--> <!-- /* 會把所有的請求攔截下來 --> <url-pattern>/*</url-pattern> </filter-mapping>
(如果是Springboot,使用注解即可)

以上這篇解決spring 處理request.getInputStream()輸入流只能讀取一次問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Hibernate框架數(shù)據(jù)分頁技術實例分析
這篇文章主要介紹了Hibernate框架數(shù)據(jù)分頁技術,結合實例形式分析了Hibernate框架實現(xiàn)數(shù)據(jù)分頁的原理,步驟與相關實現(xiàn)技巧,需要的朋友可以參考下2016-03-03
Netty分布式從recycler對象回收站獲取對象過程剖析
這篇文章主要為大家介紹了Netty分布式從recycler獲取對象的過程源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03
Spring Bean生命周期之BeanDefinition的合并過程詳解
這篇文章主要為大家詳細介紹了Spring Bean生命周期之BeanDefinition的合并過程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03

