ホームページ >Java >&#&チュートリアル >HTTP サーブレットのリクエストパラメータを消費せずに複数回アクセスするにはどうすればよいですか?
消費せずに 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 サイトの他の関連記事を参照してください。