> Java > java지도 시간 > 소비하지 않고 HTTP 서블릿 요청 매개변수에 여러 번 액세스하는 방법은 무엇입니까?

소비하지 않고 HTTP 서블릿 요청 매개변수에 여러 번 액세스하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-11-30 10:15:19
원래의
493명이 탐색했습니다.

How to Access HTTP Servlet Request Parameters Multiple Times Without Consumption?

소비 없이 HTTP 서블릿 요청 매개변수에 액세스

문제:

여러 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);
  }

  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();
    }
    // ... Implementation for newer versions of ServletInputStream interface
  }
}
로그인 후 복사

원래 요청을 이 클래스로 래핑하면 필터 체인 내외에서 여러 번 캐시된 입력 스트림을 사용하여 getParameterXXX 및 doMyThing과 같은 사용자 정의 메소드에서 매개변수를 읽을 수 있습니다.

public class MyFilter implements Filter {
  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);
  }
}
로그인 후 복사

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿