解決spring 處理request.getInputStream()輸入流只能讀取一次問題
一般我們會(huì)在InterceptorAdapter攔截器中對(duì)請(qǐng)求進(jìn)行驗(yàn)證
正常普通接口請(qǐng)求,request.getParameter()可以獲取,能多次讀取
如果我們的接口是用@RequestBody來接受數(shù)據(jù),那么我們?cè)跀r截器中
需要讀取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("------------------------------請(qǐng)求報(bào)文----------------------------------"); System.out.println(getParamsFromRequestBody((HttpServletRequest) requestWrapper)); System.out.println("------------------------------請(qǐng)求報(bào)文----------------------------------"); chain.doFilter(requestWrapper, response); } } /* * * 獲取請(qǐng)求體內(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ì)把所有的請(qǐng)求攔截下來 --> <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-03Netty分布式從recycler對(duì)象回收站獲取對(duì)象過程剖析
這篇文章主要為大家介紹了Netty分布式從recycler獲取對(duì)象的過程源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03Spring Bean生命周期之BeanDefinition的合并過程詳解
這篇文章主要為大家詳細(xì)介紹了Spring Bean生命周期之BeanDefinition的合并過程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03Java實(shí)現(xiàn)簡易圖書借閱系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡易圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03mybatis新增save結(jié)束后自動(dòng)返回主鍵id詳解
這篇文章主要介紹了mybatis新增save結(jié)束后自動(dòng)返回主鍵id詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12設(shè)計(jì)模式在Spring框架中的應(yīng)用匯總
這篇文章主要介紹了設(shè)計(jì)模式在Spring框架中的應(yīng)用匯總,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11