解決spring 處理request.getInputStream()輸入流只能讀取一次問(wèn)題
一般我們會(huì)在InterceptorAdapter攔截器中對(duì)請(qǐng)求進(jìn)行驗(yàn)證
正常普通接口請(qǐng)求,request.getParameter()可以獲取,能多次讀取
如果我們的接口是用@RequestBody來(lái)接受數(shù)據(jù),那么我們?cè)跀r截器中
需要讀取request的輸入流 ,因?yàn)?ServletRequest中g(shù)etReader()和getInputStream()只能調(diào)用一次
這樣就會(huì)導(dǎo)致controller 無(wú)法拿到數(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;//用于將流保存下來(lái)
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("開(kāi)始");
}
@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配置過(guò)濾器
<!--定義過(guò)濾器--> <filter> <!--定義過(guò)濾器攔截URL地址--> <filter-name>test2</filter-name> <!--過(guò)濾器的文件--> <filter-class>com.zhhy.hy2000interface.utils.filter.MyFilter</filter-class> </filter> <filter-mapping> <!--過(guò)濾器的名稱--> <filter-name>test2</filter-name> <!--過(guò)濾器負(fù)責(zé)攔截的URL--> <!-- /* 會(huì)把所有的請(qǐng)求攔截下來(lái) --> <url-pattern>/*</url-pattern> </filter-mapping>
(如果是Springboot,使用注解即可)

以上這篇解決spring 處理request.getInputStream()輸入流只能讀取一次問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- spring-cloud-stream結(jié)合kafka使用詳解
- Spring Cloud Stream簡(jiǎn)單用法
- springboot 中 inputStream 神秘消失之謎(終破)
- Postgresql根據(jù)響應(yīng)數(shù)據(jù)反向?qū)崿F(xiàn)建表語(yǔ)句與insert語(yǔ)句的過(guò)程
- Springcloud整合stream,rabbitmq實(shí)現(xiàn)消息驅(qū)動(dòng)功能
- springMarchal集成xStream的完整示例代碼
- SpringCloud?Stream?整合RabbitMQ的基本步驟
- 并行Stream與Spring事務(wù)相遇會(huì)發(fā)生什么?
相關(guān)文章
java使用websocket,并且獲取HttpSession 源碼分析(推薦)
這篇文章主要介紹了java使用websocket,并且獲取HttpSession,通過(guò)使用配置源碼分析了各方面知識(shí)點(diǎn),具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。2017-08-08
java實(shí)現(xiàn)周期性執(zhí)行(定時(shí)任務(wù))
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)周期性執(zhí)行定時(shí)任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
Mybatis-plus更新字段為null兩種常用方法及優(yōu)化
Mybatis Plus在進(jìn)行更新操作時(shí),默認(rèn)情況下是不能將字段更新為null的,如果要更新字段為null,需要進(jìn)行以下處理,這篇文章主要給大家介紹了關(guān)于Mybatis-plus更新字段為null的兩種常用方法及優(yōu)化,需要的朋友可以參考下2024-03-03
Java過(guò)濾器filter_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java過(guò)濾器filter,通過(guò)過(guò)濾器,可以對(duì)來(lái)自客戶端的請(qǐng)求進(jìn)行攔截,進(jìn)行預(yù)處理或者對(duì)最終響應(yīng)給客戶端的數(shù)據(jù)進(jìn)行處理后再輸出2017-07-07
Java 常用類解析:java異常機(jī)制,異常棧,異常處理方式,異常鏈,異常丟失詳解
這篇文章主要介紹了Java 常用類解析:java異常機(jī)制,異常棧,異常處理方式,異常鏈,異常丟失詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03
Springboot如何使用OSHI獲取和操作系統(tǒng)和硬件信息
這篇文章主要介紹了Springboot如何使用OSHI獲取和操作系統(tǒng)和硬件信息問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10

