[SPRING] HttpServletRequestWrapper, setReadListener 예제 구현 / isFinished / isReady?
SPRINGHttpServletRequestWrapper, setReadListener 예제 구현 / isFinished / isReady?
HTTP POST 본문을 필터에서 사용한 후에 읽을 수 있도록 HttpServletRequestWrapper (InputStream을 여러 번 읽는 방법 참조)를 적용하려고합니다. 이제 ServletInputStream을 구현하는 방법에 대한 도전 과제에 착수했습니다. 사양 3.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.Spring 프레임 워크에서 MockHttpServletRequest를 확인할 수있다.
Spring 프레임 워크에서 MockHttpServletRequest를 확인할 수있다.
소스 코드는 여기에서 찾을 수 있습니다.
Spring은 Apache2 라이선스가있는 오픈 소스이기 때문에 코드에서 시작하여 자신 만의 버전을 만들 수 있습니다.
from https://stackoverflow.com/questions/29208456/httpservletrequestwrapper-example-implementation-for-setreadlistener-isfinish by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 두 개의 MVC 구성으로 봄 부팅 (0) | 2019.03.05 |
---|---|
[SPRING] Spring 3 / Hibernate에서 트랜잭션을 롤백하기위한 베스트 프랙티스 (0) | 2019.03.05 |
[SPRING] XML Bean은 Spring Boot 애플리케이션에 어디에 넣어야합니까? (0) | 2019.03.05 |
[SPRING] JDBCTemplate.queryForMap을 사용하여지도 데이터를 얻는 방법 (0) | 2019.03.05 |
[SPRING] HTML과 JSON 요청에 대해 Spring MVC에서 예외를 다르게 처리하는 방법 (0) | 2019.03.04 |