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