ホームページ > Java > &#&チュートリアル > 複数の読み取りのために Java サーブレットの POST 本文パラメータを保持する方法

複数の読み取りのために Java サーブレットの POST 本文パラメータを保持する方法

Mary-Kate Olsen
リリース: 2024-11-30 22:42:11
オリジナル
901 人が閲覧しました

How to Preserve POST Body Parameters in Java Servlets for Multiple Reads?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート