>Java >java지도 시간 >다중 읽기를 위해 Java 서블릿에서 POST 본문 매개변수를 보존하는 방법은 무엇입니까?

다중 읽기를 위해 Java 서블릿에서 POST 본문 매개변수를 보존하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-30 22:42:11902검색

How to Preserve POST Body Parameters in Java Servlets for Multiple Reads?

Http 서블릿 요청에서 POST 본문 매개변수를 유지하는 방법

Java 서블릿에서 HTTP 요청으로 작업할 때 다음의 영향을 고려하는 것이 중요합니다. 필터 체인의 추가 처리 시 요청 매개변수에 액세스합니다. 기본적으로 POST 요청 본문에서 매개변수를 읽으면 해당 매개변수가 소비되므로 후속 필터나 핸들러에서 사용할 수 없게 됩니다.

문제: POST 본문 매개변수 소비

Java 서블릿에서 , 요청 본문 매개변수는 request.getParameter()를 통해 액세스할 수 있습니다. 그러나 이 메소드는 inputStream을 사용하므로 매개변수를 검색하려는 후속 시도는 실패합니다. 이 동작은 다운스트림 핸들러에서 매개변수를 사용하기 전에 매개변수에 액세스해야 하는 필터의 경우 특히 문제가 됩니다.

해결책: 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());
    }

    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();
        }

        // Implement other methods required by ServletInputStream interface, such as isFinished, isReady, setReadListener, etc.

    }
}

사용법:

POST를 보존하려면 본문 매개변수를 사용하면 필터를 통과하기 전에 MultiReadHttpServletRequest에 원래 요청을 래핑할 수 있습니다. chain:

public class MyFilter implements Filter {

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

        // Wrap the request to enable multiple reads of the request body
        MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest((HttpServletRequest) request);

        // Read the request body for our own processing
        doMyThing(multiReadRequest.getInputStream());

        // Continue the filter chain with the wrapped request, allowing subsequent handlers to access the cached request body
        chain.doFilter(multiReadRequest, response);
    }
}

이 접근 방식을 사용하면 POST 본문 매개변수를 조기에 사용할 걱정 없이 여러 번 액세스할 수 있습니다.

위 내용은 다중 읽기를 위해 Java 서블릿에서 POST 본문 매개변수를 보존하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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