>Java >java지도 시간 >HTTP POST 요청 매개변수를 사용하지 않고 여러 번 읽을 수 있는 방법은 무엇입니까?

HTTP POST 요청 매개변수를 사용하지 않고 여러 번 읽을 수 있는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-07 06:18:11207검색

How Can I Read HTTP POST Request Parameters Multiple Times Without Consuming Them?

포스트 본문에서 HTTP 서블릿 요청 매개변수가 사라짐

문제:

Java 서블릿 필터에서 여러 POST 요청 본문에서 검색된 HTTP 요청 매개변수로 인해 두 번째 매개변수를 사용할 수 없게 됩니다. 이는 매개변수를 소비하면 전체 요청에 대해 매개변수를 소비하기 때문에 발생합니다.

질문:

소비하지 않고 요청 매개변수를 읽을 수 있는 방법이 있습니까?

답변:

대체 솔루션:

Aspect를 사용하여 사용자 정의 인터셉터 구성 요소를 생성하는 것이 대안 솔루션이 될 수 있습니다. , 필터 체인을 사용하지 않고 다중 읽기를 가능하게 하고 향상된 기능을 제공합니다. 효율성.

확장된 HttpServletRequestWrapper 솔루션:

필터 체인의 여러 읽기에 대한 요청 본문 매개변수를 유지하려면 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);
  }

  // CachedServletInputStream implementation omitted for brevity
}

필터 사용법:

필터 체인을 통과하기 전에 원래 요청을 확장 클래스에 래핑합니다.

public class MyFilter implements Filter {
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest((HttpServletRequest) request);

    // Perform multiple reads here

    chain.doFilter(multiReadRequest, response);
  }
}

이 접근 방식을 사용하면 getInputStream(), getReader(), 및 매개변수 검색 방법.

최신 버전 업데이트 ServletInputStream:

캐시된 스트림 구현에 추가 메서드 isReady(), setReadListener() 및 isFinished()를 구현하여 업데이트된 ServletInputStream 인터페이스를 준수합니다.

위 내용은 HTTP POST 요청 매개변수를 사용하지 않고 여러 번 읽을 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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