spring 처리 request.getInputStream()입력 흐름 을 해결 하려 면 한 번 만 문 제 를 읽 을 수 있 습 니 다.

일반적으로 저 희 는 InterceptorAdapter 차단기 에서 요청 을 검증 합 니 다.
정상 적 인 일반 인터페이스 요청,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()입력 흐름 은 한 번 만 읽 을 수 있 습 니 다.문 제 는 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.여러분 들 도 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기