문제:
Java 서블릿 필터에서 HTTP 요청에 액세스 POST 요청 본문의 매개변수로 인해 나중에 필터 체인에서 매개변수를 사용할 수 없게 될 수 있습니다. 이는 초기 읽기 중에 요청 본문이 소비되기 때문에 발생합니다.
해결책:
이 문제를 극복하고 요청 본문 매개변수의 다중 읽기를 활성화하려면 다음과 같은 솔루션이 필요합니다. 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()); } @Override public BufferedReader getReader() throws IOException{ return new BufferedReader(new InputStreamReader(getInputStream())); } private void cacheInputStream() throws IOException { 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"); } } }
사용법:
필터 체인을 통과하기 전에 원래 요청을 사용자 정의 래퍼로 래핑합니다.
public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest((HttpServletRequest) request); doMyThing(multiReadRequest.getInputStream()); chain.doFilter(multiReadRequest, response); } }
이렇게 하면 getInputStream() 또는 getReader() 메소드.
참고:
최신 버전의 ServletInputStream 인터페이스의 경우 isReady() 및 setReadListener()와 같은 추가 메소드를 사용자 정의에서 구현해야 합니다. 입력 스트림 클래스. 자세한 내용은 답변에 제공된 링크를 참조하세요.
위 내용은 Java 서블릿 필터에서 POST 요청 본문의 다중 읽기를 활성화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!