2016-04-25 25 views
0
RequestLogHandler requestLogHandler = new RequestLogHandler(); 
Slf4jRequestLog requestLog = new CustomSlf4jRequestLog(); 
requestLogHandler.setRequestLog(requestLog); 

Slf4jRequestLogは、リクエストメソッド、URLと日付、応答ステータスコードと書き込まれたバイトのみを記録します。 私のPUT/POSTリクエストの本文を確実に記録したいと思います。 私はSlf4jRequestLogからCustomSlf4jRequestLogを導出し、私が試した:それはすでにハンドラによって処理されるよう桟橋サーバーログリクエストボディ

public void log(Request request, Response response) { 
     StringBuilder sb = new StringBuilder("RequestBody: "); 
     try { 
      LOG.info("BODY SIZE: " + request.getContentLength()); 
      BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream())); 
      String line; 
      while ((line = in.readLine()) != null) { 
       sb.append(line); 
      } 
      LOG.info(sb.toString()); 

残念ながら体がプリントアウトされていませんか?

ここで申請することは可能ですか?

(私はJsonProviderを持っているので私は本当に気にしています。私はJsonがデータを解析できないときに要求全体を見たいと思っています)または私のアプリケーションが失敗したときに、 。

答えて

0

サーブレットの仕様はこちらです。

すでにリクエストボディを読み取った要求を処理している実際のサーブレットは、さらに胸が張り裂けることから読み込むrequest.getInputStream()無効(あなたがEOFである)

あなたがリクエストボディをキャプチャしたい場合は、あなたが作成する必要がありますカスタムサーブレットFilterを入力して、getInputStream()getReader()のメソッドをオーバーライドして、読み取られたデータのコピーを作成する独自の実装でHttpServletRequestをラップします。

リクエスト本体の内容のコピーで何をしたいかを決定するのはあなた次第です。

または

あなただけのリクエストボディが何であったか確認するためにWiresharkのようなネットワークキャプチャユーティリティを使用することができます。 HTTPSを使用していても、サーバ証明書でWiresharkを設定して、暗号化された会話を調べることができます。

0

ロガーは同じリクエストでgetInputStream()をもう一度呼び出しています。同じデータを2回読み取ることはできません。リクエストの本文をコピーするには、ServletRequestWrapperを作成する必要があります。

関連する問題