2016-11-01 9 views
1

私はJettyを使用しており、リクエストのパラメータと本文を記録したいと思います。ハンドラにJetty RequestLog - 読書リクエストボディを発行

追加AccessLogger:私はrequest.getReader()を実行しようとすると

@Override 
public void log(Request request, Response response) { 
    request.getReader(); 
} 

問題がある、それはIllegalStateException: STREAMEDを言うこと:

AccessLoggerはRequstLogインタフェースを実装しています。以前のハンドラがすでにすべてのデータを読み込んでいるからだと思います。しかし、私はそれを必要な方法でどのようにログに記録できますか?

答えて

0

標準サーブレットの動作。

サーブレットが(getInputStream()またはgetReader()のいずれかを介して)リクエスト本文を読み取った場合、それを読んだら、再度読み取ることはできません。

使用される手法は、getReader()またはgetInputStream()です。そのボディコンテンツはどのように表示され、変更することはできません。

  • getReader()を使用した場合、getInputStream()は後で使用できません。
  • getInputStream()を使用した場合、getReader()は後で使用できません。

詳細については、getReader()およびgetInputStream()のJavadocを参照してください。

+0

はい、それは私が想定したものです。しかし、この場合の回避策は何ですか?複数のハンドラが存在する可能性がある場合は、すべてリクエストから読み取ることができるはずです。 – awfun

+0

いいえ、サーブレット仕様ではサポートされていません。その必要がある場合は、コンテンツをどこかに読み込んでキャッシュする必要があり(ディスク上で推薦する)、後続の各サーブレットはキャッシュされたバージョンにアクセスする必要があります(サーブレットAPI経由ではありません)。 Servlet 3.1とAsync I/Oが仕様に追加されて以来、HttpServletRequestをオーバーライド/ラップする複雑なものを考え出すことができます。 –

関連する問題