1

ここで説明されている問題が発生していますが、対処方法がわかりません。

問題は、リクエストの本文を読み取らなければならないAuthenticationProviderがあることです。ただし、コントローラーメソッドが@RequestMappingを介してそのデータを使用する場合、プロバイダーはすでにinputStreamを読み取っているため、データは空です。

マーク/リセットをサポートするinputReaderをRequestから取得して、プロバイダーが認証を行った後にストリームを初期状態にロールバックできるようにする方法はありますか?フィルタのデフォルトの動作がリクエストオブジェクトの破壊的な変更であるのはおかしなことに思えます。

4

1 に答える 1

4

プロバイダーは特定の場合にのみトリガーされる必要があるため、アプリケーション全体に影響を与えるべきではありません。ただし、プロバイダーによって処理されるリクエストに本文が必要な場合は、回避策があります。

  1. サーブレットを実装するFilter
  2. リクエストをラップする
  3. ラッパーでリクエスト本文をキャッシュし、メソッドをオーバーライドして、キャッシュされたリクエスト本文でgetInputStream()a を返しますByteArrayInputStream。そうすれば、何度でも読めます。

spring'sAbstractRequestLoggingFilterも同様のことを行い、ラッパーの例があります。確認できます。

于 2012-08-06T18:08:47.680 に答える