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

HTTP サーブレットのリクエストパラメータを消費せずに複数回アクセスするにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-30 10:15:19502ブラウズ

How to Access HTTP Servlet Request Parameters Multiple Times Without Consumption?

消費せずに HTTP サーブレット リクエスト パラメータにアクセスする

問題:

複数の 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);
  }

  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();
    }
    // ... Implementation for newer versions of ServletInputStream interface
  }
}

このクラスで元のリクエストをラップすることで、次のことができます。キャッシュされた入力ストリームにフィルター チェーン内およびそれ以降で複数回アクセスし、getParameterXXX と doMyThing などのカスタム メソッドの両方でパラメーターを読み取ることができるようにします:

public class MyFilter implements Filter {
  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);
  }
}

以上がHTTP サーブレットのリクエストパラメータを消費せずに複数回アクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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