복붙노트

[SPRING] HttpServletRequestWrapper, setReadListener 예제 구현 / isFinished / isReady?

SPRING

HttpServletRequestWrapper, setReadListener 예제 구현 / isFinished / isReady?

HTTP POST 본문을 필터에서 사용한 후에 읽을 수 있도록 HttpServletRequestWrapper (InputStream을 여러 번 읽는 방법 참조)를 적용하려고합니다. 이제 ServletInputStream을 구현하는 방법에 대한 도전 과제에 착수했습니다. 사양 3.1에서 구현되어야하는 새로운 방법이 있습니다.

이 메서드를 구현하는 방법에 대한 예제 또는 일부 코드를 찾고 있습니다. 어떤 힌트?

해결법

  1. ==============================

    1.구현 예 :

    구현 예 :

    import com.google.common.primitives.Bytes;
    import javax.servlet.ReadListener;
    import javax.servlet.ServletInputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Arrays;
    
    public class AuthenticationRequestWrapper extends HttpServletRequestWrapper {
    
        // tag::variables[]
        private byte[] requestBody = new byte[0];
        private boolean bufferFilled = false;
        // end::variables[]
    
        /**
         - Constructs a request object wrapping the given request.
         *
         - @param request The request to wrap
         - @throws IllegalArgumentException if the request is null
         */
        public AuthenticationRequestWrapper(HttpServletRequest request) {
            super(request);
        }
    
    
        // tag::getRequestBody[]
        public byte[] getRequestBody() throws IOException {
            if (bufferFilled) {
                return Arrays.copyOf(requestBody, requestBody.length);
            }
    
            InputStream inputStream = super.getInputStream();
    
            byte[] buffer = new byte[102400]; // 100kb buffer
    
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                requestBody = Bytes.concat(this.requestBody, Arrays.copyOfRange(buffer, 0, bytesRead)); // <1>
            }
    
            bufferFilled = true;
    
            return requestBody;
        }
        // end::getRequestBody[]
    
        // tag::getInputStream[]
        @Override
        public ServletInputStream getInputStream() throws IOException {
            return new CustomServletInputStream(getRequestBody()); // <1>
        }
        // end::getInputStream[]
    
        private static class CustomServletInputStream extends ServletInputStream {
    
            private ByteArrayInputStream buffer;
    
            public CustomServletInputStream(byte[] contents) {
                this.buffer = new ByteArrayInputStream(contents);
            }
    
            @Override
            public int read() throws IOException {
                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");
            }
        }
    }
    
  2. ==============================

    2.Spring 프레임 워크에서 MockHttpServletRequest를 확인할 수있다.

    Spring 프레임 워크에서 MockHttpServletRequest를 확인할 수있다.

    소스 코드는 여기에서 찾을 수 있습니다.

    Spring은 Apache2 라이선스가있는 오픈 소스이기 때문에 코드에서 시작하여 자신 만의 버전을 만들 수 있습니다.

  3. from https://stackoverflow.com/questions/29208456/httpservletrequestwrapper-example-implementation-for-setreadlistener-isfinish by cc-by-sa and MIT license