問題:
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 中国語 Web サイトの他の関連記事を参照してください。