문제:
Java 서블릿 필터에서 여러 POST 요청 본문에서 검색된 HTTP 요청 매개변수로 인해 두 번째 매개변수를 사용할 수 없게 됩니다. 이는 매개변수를 소비하면 전체 요청에 대해 매개변수를 소비하기 때문에 발생합니다.
질문:
소비하지 않고 요청 매개변수를 읽을 수 있는 방법이 있습니까?
답변:
대체 솔루션:
Aspect를 사용하여 사용자 정의 인터셉터 구성 요소를 생성하는 것이 대안 솔루션이 될 수 있습니다. , 필터 체인을 사용하지 않고 다중 읽기를 가능하게 하고 향상된 기능을 제공합니다. 효율성.
확장된 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()); } @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); } // CachedServletInputStream implementation omitted for brevity }
필터 사용법:
필터 체인을 통과하기 전에 원래 요청을 확장 클래스에 래핑합니다.
public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest((HttpServletRequest) request); // Perform multiple reads here chain.doFilter(multiReadRequest, response); } }
이 접근 방식을 사용하면 getInputStream(), getReader(), 및 매개변수 검색 방법.
최신 버전 업데이트 ServletInputStream:
캐시된 스트림 구현에 추가 메서드 isReady(), setReadListener() 및 isFinished()를 구현하여 업데이트된 ServletInputStream 인터페이스를 준수합니다.
위 내용은 HTTP POST 요청 매개변수를 사용하지 않고 여러 번 읽을 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!