Spring Boot アプリケーションがあります。すべての POST リクエストのリクエスト本文を変更します。リクエストがコントローラーに到達する前にリクエスト本文を変更することは可能ですか。例を挙げてください。
ベストアンサー1
短い答え
はい、でも簡単ではありません。
詳細
コントローラのハンドラ メソッドに到達する前にリクエストの本文を変更するオプションが 3 つあることはわかっています。
- メソッドが呼び出される前に、AOP を使用してリクエストを変更します。
- HTTP フィルターを作成します。
- カスタム Spring HandlerInterceptor を作成します。
すでに spring-boot を使用している場合は、オプション 3 (カスタム Spring HandlerInterceptor) が最適なオプションと思われます。
ここにリンクがありますベルドゥングの記事Spring HandlerInterceptors をカバーします。
InputStrem
Baeldung の記事は、返された内容をHttpServletRequest
一度しか読み取れないため、問題に対する完全な回答にはなりません。
HttpServletRequest
カスタム HandlerInterceptor 内またはカスタム Filter (ここでは Filter が適している可能性があります) 内のラッパー クラス内のすべてのリクエストを拡張してラップするラッパー クラスを作成する必要があります。
ラッパークラス
HttpServletRequest
ラッパークラスのコンストラクタでInputStreamを読み取ります- 要件に応じて本文を変更します。
- 変更された本体を に書き込みます
ByteArrayOutputStream
。 - ストリームから
toByteArray
実際のものを取得するために使用します。byte[]
- ByteArrayOutputStream を閉じます (try-with-resources がこれに適しています)。
- メソッドをオーバーライドします
getInputStream
。 - が呼び出されるたびに、を
byte[]
ByteArrayInputStream でラップしますgetInputStream
。このストリームを返します。
リクエストをラップする方法
- フィルターで、ラッパー クラスをインスタンス化し、元のリクエスト (doFilter メソッドへのパラメーター) を渡します。
- ラッパーを chain.doFilter メソッドに渡します (元のリクエストではありません)。