ホームページ > Java > &#&チュートリアル > Java サーブレット フィルターで POST リクエスト本文の複数の読み取りを有効にする方法

Java サーブレット フィルターで POST リクエスト本文の複数の読み取りを有効にする方法

Barbara Streisand
リリース: 2024-11-28 15:21:12
オリジナル
150 人が閲覧しました

How to Enable Multiple Reads of POST Request Body in Java Servlet Filters?

Java サーブレット フィルタでのポスト リクエスト本文の複数読み取り

問題:

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

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