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