ホームページ >Java >&#&チュートリアル >HTTP POST リクエストのパラメータを消費せずに複数回読み取るにはどうすればよいですか?

HTTP POST リクエストのパラメータを消費せずに複数回読み取るにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-07 06:18:11207ブラウズ

How Can I Read HTTP POST Request Parameters Multiple Times Without Consuming Them?

HTTP サーブレット リクエスト パラメータがポスト本文で消える

問題:

Java サーブレット フィルタで、複数のサーブレット フィルタにアクセスしようとすると、 POST リクエスト本文から HTTP リクエストパラメータを取得すると、2 番目のパラメータが使用できなくなります。これは、パラメータを消費するとリクエスト全体でパラメータが消費されるために発生します。

質問:

リクエスト パラメータを消費せずに読み取る方法はありますか?

答え:

代替案解決策:

アスペクトを使用してカスタム インターセプター コンポーネントを作成することは、代替ソリューションとなり、フィルター チェーンを関与させずに複数の読み取りを可能にし、効率を向上させることができます。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。