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 중국어 웹사이트의 기타 관련 기사를 참조하세요!