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 を保存するにはbody パラメーターを使用すると、元のリクエストをフィルターに渡す前に 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 中国語 Web サイトの他の関連記事を参照してください。