> Java > java지도 시간 > 내 HTTP 서블릿 요청이 단일 읽기 후 POST 본문 매개변수를 잃는 이유는 무엇입니까?

내 HTTP 서블릿 요청이 단일 읽기 후 POST 본문 매개변수를 잃는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-27 18:00:17
원래의
918명이 탐색했습니다.

Why Does My Http Servlet Request Lose POST Body Parameters After a Single Read?

Http 서블릿 요청은 한 번 읽은 후 POST 본문에서 매개변수를 잃습니다

이 상황에서는 POST 요청을 처리할 때 다음 사항을 이해하는 것이 중요합니다. , 매개변수는 일반적으로 요청 본문에 전송됩니다. 기본적으로 서블릿 컨테이너는 매개변수에 처음 액세스할 때 입력 문자 스트림 또는 이진 스트림을 사용합니다. 결과적으로 필터 체인에서 해당 항목에 액세스하려는 후속 시도가 실패합니다.

이 문제를 극복하려면 고려해야 할 두 가지 기본 접근 방식이 있습니다.

1. 인터셉터 구성 요소:

필터 체인을 사용하는 대신 인터셉터 구성 요소를 활용할 수 있습니다. 이러한 구성 요소는 측면을 사용하여 구현될 수 있으며 소비된 요청 InputStream에 의존하지 않고 구문 분석된 요청 본문의 작업을 허용합니다. 이 접근 방식은 일반적으로 자신의 모델 객체를 생성하기 위해 요청 InputStream이 한 번만 구문 분석되므로 더 효율적입니다.

2. HttpServletRequestWrapper:

HTTP 계층에서 필터 체인을 선호하는 경우 HttpServletRequestWrapper를 확장하는 것이 효과적인 방법입니다. 이 기술에는 요청 InputStream을 사용하고 바이트를 캐싱하는 작업이 포함됩니다.

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 {
        /* Cache the inputstream in order to read it multiple times. For
         * convenience, I use apache.commons IOUtils
         */
        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");
        }
    }
}
로그인 후 복사

필터 체인을 통과하기 전에 원래 요청을 MultiReadHttpServletRequest로 래핑하여 요청 본문을 여러 번 읽을 수 있습니다. 이 솔루션은 또한 getParameterXXX 메소드를 통해 다중 읽기를 용이하게 합니다.

편집:

최신 버전의 ServletInputStream 인터페이스의 경우 isReady 및 setReadListener와 같은 추가 메소드가 필요합니다. 구현되었습니다. 자세한 내용은 이 질문을 참조하세요.

위 내용은 내 HTTP 서블릿 요청이 단일 읽기 후 POST 본문 매개변수를 잃는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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