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

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

Dreamweaver Mac版
시각적 웹 개발 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.
