spring 처리 request.getInputStream()입력 흐름 을 해결 하려 면 한 번 만 문 제 를 읽 을 수 있 습 니 다.
정상 적 인 일반 인터페이스 요청,request.getParameter()를 가 져 올 수 있 습 니 다.여러 번 읽 을 수 있 습 니 다.
만약 우리 의 인터페이스 가@RequestBody 로 데 이 터 를 받아들인다 면,우 리 는 차단기 에 있 습 니 다
servletRequest 에서 getReader()와 getInputStream()은 한 번 만 호출 할 수 있 기 때문에 request 의 입력 흐름 을 읽 어야 합 니 다.
이렇게 하면 controller 가 데 이 터 를 받 지 못 하 게 할 것 이다.
해결 방법:
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 계승 필터
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);
}
}
/* *
*
* @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.웹.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()입력 흐름 은 한 번 만 읽 을 수 있 습 니 다.문 제 는 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.여러분 들 도 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.