Spring Bootでコントローラーに到達する前にリクエスト本文を変更する方法 質問する

Spring Bootでコントローラーに到達する前にリクエスト本文を変更する方法 質問する

Spring Boot アプリケーションがあります。すべての POST リクエストのリクエスト本文を変更します。リクエストがコントローラーに到達する前にリクエスト本文を変更することは可能ですか。例を挙げてください。

ベストアンサー1

短い答え
はい、でも簡単ではありません。

詳細
コントローラのハンドラ メソッドに到達する前にリクエストの本文を変更するオプションが 3 つあることはわかっています。

  1. メソッドが呼び出される前に、AOP を使用してリクエストを変更します。
  2. HTTP フィルターを作成します。
  3. カスタム Spring HandlerInterceptor を作成します。

すでに spring-boot を使用している場合は、オプション 3 (カスタム Spring HandlerInterceptor) が最適なオプションと思われます。

ここにリンクがありますベルドゥングの記事Spring HandlerInterceptors をカバーします。

InputStremBaeldung の記事は、返された内容をHttpServletRequest一度しか読み取れないため、問題に対する完全な回答にはなりません。

HttpServletRequestカスタム HandlerInterceptor 内またはカスタム Filter (ここでは Filter が適している可能性があります) 内のラッパー クラス内のすべてのリクエストを拡張してラップするラッパー クラスを作成する必要があります。

ラッパークラス

  1. HttpServletRequestラッパークラスのコンストラクタでInputStreamを読み取ります
  2. 要件に応じて本文を変更します。
  3. 変更された本体を に書き込みますByteArrayOutputStream
  4. ストリームからtoByteArray実際のものを取得するために使用します。byte[]
  5. ByteArrayOutputStream を閉じます (try-with-resources がこれに適しています)。
  6. メソッドをオーバーライドしますgetInputStream
  7. が呼び出されるたびに、をbyte[]ByteArrayInputStream でラップしますgetInputStream。このストリームを返します。

リクエストをラップする方法

  1. フィルターで、ラッパー クラスをインスタンス化し、元のリクエスト (doFilter メソッドへのパラメーター) を渡します。
  2. ラッパーを chain.doFilter メソッドに渡します (元のリクエストではありません)。

おすすめ記事