>Java >java지도 시간 >Java 서블릿 필터에서 POST 요청 본문의 다중 읽기를 활성화하는 방법은 무엇입니까?

Java 서블릿 필터에서 POST 요청 본문의 다중 읽기를 활성화하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-28 15:21:12149검색

How to Enable Multiple Reads of POST Request Body in Java Servlet Filters?

Java 서블릿 필터에서 게시물 요청 본문을 여러 번 읽음

문제:

Java 서블릿 필터에서 HTTP 요청에 액세스 POST 요청 본문의 매개변수로 인해 나중에 필터 체인에서 매개변수를 사용할 수 없게 될 수 있습니다. 이는 초기 읽기 중에 요청 본문이 소비되기 때문에 발생합니다.

해결책:

이 문제를 극복하고 요청 본문 매개변수의 다중 읽기를 활성화하려면 다음과 같은 솔루션이 필요합니다. HttpServletRequestWrapper를 확장하고 입력 스트림 바이트를 캐싱합니다. 다음은 사용자 정의 요청 래퍼 클래스입니다.

public class MultiReadHttpServletRequest extends HttpServletRequestWrapper {
  private ByteArrayOutputStream cachedBytes;

  public MultiReadHttpServletRequest(HttpServletRequest request) {
    super(request);
  }

  @Override
  public ServletInputStream getInputStream() throws IOException {
    if (cachedBytes == null)
      cacheInputStream();

      return new CachedServletInputStream(cachedBytes.toByteArray());
  }

  @Override
  public BufferedReader getReader() throws IOException{
    return new BufferedReader(new InputStreamReader(getInputStream()));
  }

  private void cacheInputStream() throws IOException {
    cachedBytes = new ByteArrayOutputStream();
    IOUtils.copy(super.getInputStream(), cachedBytes);
  }

  /* An input stream which reads the cached request body */
  private static class CachedServletInputStream extends     ServletInputStream {

    private final ByteArrayInputStream buffer;

    public CachedServletInputStream(byte[] contents) {
      this.buffer = new ByteArrayInputStream(contents);
    }

    @Override
    public int read() {
      return buffer.read();
    }

    @Override
    public boolean isFinished() {
      return buffer.available() == 0;
    }

    @Override
    public boolean isReady() {
      return true;
    }

    @Override
    public void setReadListener(ReadListener listener) {
  throw new RuntimeException("Not implemented");
    }
  }
}

사용법:

필터 체인을 통과하기 전에 원래 요청을 사용자 정의 래퍼로 래핑합니다.

public class MyFilter implements Filter {
  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {

    MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest((HttpServletRequest) request);
    doMyThing(multiReadRequest.getInputStream());
    chain.doFilter(multiReadRequest, response);
  }
}

이렇게 하면 getInputStream() 또는 getReader() 메소드.

참고:

최신 버전의 ServletInputStream 인터페이스의 경우 isReady() 및 setReadListener()와 같은 추가 메소드를 사용자 정의에서 구현해야 합니다. 입력 스트림 클래스. 자세한 내용은 답변에 제공된 링크를 참조하세요.

위 내용은 Java 서블릿 필터에서 POST 요청 본문의 다중 읽기를 활성화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.