解決spring 處理request.getInputStream()輸入流只能讀取一次問題
一般我們會(huì)在InterceptorAdapter攔截器中對請求進(jìn)行驗(yàn)證
正常普通接口請求,request.getParameter()可以獲取,能多次讀取
如果我們的接口是用@RequestBody來接受數(shù)據(jù),那么我們在攔截器中
需要讀取request的輸入流 ,因?yàn)?ServletRequest中g(shù)etReader()和getInputStream()只能調(diào)用一次
這樣就會(huì)導(dǎo)致controller 無法拿到數(shù)據(jù)。
解決方法 :
1、自定義一個(gè)類 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("------------------------------請求報(bào)文----------------------------------");
System.out.println(getParamsFromRequestBody((HttpServletRequest) requestWrapper));
System.out.println("------------------------------請求報(bào)文----------------------------------");
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> <!--過濾器負(fù)責(zé)攔截的URL--> <!-- /* 會(huì)把所有的請求攔截下來 --> <url-pattern>/*</url-pattern> </filter-mapping>
(如果是Springboot,使用注解即可)

以上這篇解決spring 處理request.getInputStream()輸入流只能讀取一次問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- spring-cloud-stream結(jié)合kafka使用詳解
- Spring Cloud Stream簡單用法
- springboot 中 inputStream 神秘消失之謎(終破)
- Postgresql根據(jù)響應(yīng)數(shù)據(jù)反向?qū)崿F(xiàn)建表語句與insert語句的過程
- Springcloud整合stream,rabbitmq實(shí)現(xiàn)消息驅(qū)動(dòng)功能
- springMarchal集成xStream的完整示例代碼
- SpringCloud?Stream?整合RabbitMQ的基本步驟
- 并行Stream與Spring事務(wù)相遇會(huì)發(fā)生什么?
相關(guān)文章
Hibernate框架數(shù)據(jù)分頁技術(shù)實(shí)例分析
這篇文章主要介紹了Hibernate框架數(shù)據(jù)分頁技術(shù),結(jié)合實(shí)例形式分析了Hibernate框架實(shí)現(xiàn)數(shù)據(jù)分頁的原理,步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-03-03
Netty分布式從recycler對象回收站獲取對象過程剖析
這篇文章主要為大家介紹了Netty分布式從recycler獲取對象的過程源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
Spring Bean生命周期之BeanDefinition的合并過程詳解
這篇文章主要為大家詳細(xì)介紹了Spring Bean生命周期之BeanDefinition的合并過程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
Java實(shí)現(xiàn)簡易圖書借閱系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡易圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
mybatis新增save結(jié)束后自動(dòng)返回主鍵id詳解
這篇文章主要介紹了mybatis新增save結(jié)束后自動(dòng)返回主鍵id詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
設(shè)計(jì)模式在Spring框架中的應(yīng)用匯總
這篇文章主要介紹了設(shè)計(jì)模式在Spring框架中的應(yīng)用匯總,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11

