最新の安定バージョンについては、Spring Framework 6.2.11 を使用してください!

フィルター

spring-web モジュールは、いくつかの有用なフィルターを提供します。

フォームデータ

ブラウザーは、HTTP GET または HTTP POST を介してのみフォームデータを送信できますが、ブラウザー以外のクライアントも HTTP PUT、PATCH、DELETE を使用できます。サーブレット API では、HTTP POST のフォームフィールドアクセスのみをサポートするために ServletRequest.getParameter*() メソッドが必要です。

spring-web モジュールは FormContentFilter を提供し、コンテンツ型 application/x-www-form-urlencoded の HTTP PUT、PATCH、DELETE リクエストをインターセプトし、リクエストの本文からフォームデータを読み取り、ServletRequest をラップして、ServletRequest.getParameter*() ファミリーのメソッドでフォームデータを利用できるようにします。

Forwarded ヘッダー

リクエストがプロキシ(ロードバランサーなど)を通過すると、ホスト、ポート、スキームが変更される可能性があるため、クライアントの観点から正しいホスト、ポート、スキームを指すリンクを作成することが困難になります。

RFC 7239 [IETF] (英語) は、プロキシが元のリクエストに関する情報を提供するために使用できる Forwarded HTTP ヘッダーを定義します。X-Forwarded-HostX-Forwarded-PortX-Forwarded-ProtoX-Forwarded-SslX-Forwarded-Prefix など、他の非標準ヘッダーもあります。

ForwardedHeaderFilter は、a) Forwarded ヘッダーに基づいてホスト、ポート、スキームを変更し、b)これらのヘッダーを削除してさらなる影響を排除するために、リクエストを変更するサーブレットフィルターです。フィルターはリクエストをラップすることに依存しているため、RequestContextFilter など、他のフィルターよりも先に並べ替える必要があります。これは、元のリクエストではなく、変更されたリクエストで機能するはずです。

転送されたヘッダーには、意図したとおりにプロキシによってヘッダーが追加されたか、悪意のあるクライアントによってヘッダーが追加されたかをアプリケーションが認識できないため、セキュリティ上の考慮事項があります。これが、外部からの信頼できない Forwarded ヘッダーを削除するように、信頼の境界にあるプロキシを構成する必要がある理由です。ForwardedHeaderFilter を removeOnly=true で構成することもできます。この場合、ヘッダーは削除されますが、使用されません。

非同期リクエストとエラーディスパッチをサポートするには、このフィルターを DispatcherType.ASYNC および DispatcherType.ERROR にマップする必要があります。Spring Framework の AbstractAnnotationConfigDispatcherServletInitializer ( サーブレット構成を参照) を使用する場合、すべてのディスパッチ型に対してすべてのフィルターが自動的に登録されます。ただし、web.xml 経由でフィルターを登録する場合、または FilterRegistrationBean 経由で Spring Boot にフィルターを登録する場合は、DispatcherType.REQUEST に加えて DispatcherType.ASYNC および DispatcherType.ERROR を必ず含めてください。

浅い ETag

ShallowEtagHeaderFilter フィルターは、レスポンスに書き込まれたコンテンツをキャッシュし、そこから MD5 ハッシュを計算することにより、「浅い」ETag を作成します。次回クライアントが送信するとき、同じことを行いますが、計算された値を If-None-Match リクエストヘッダーと比較し、2 つが等しい場合、304(NOT_MODIFIED)を返します。

この戦略では、リクエストごとに完全なレスポンスを計算する必要があるため、ネットワーク帯域幅は節約されますが、CPU は節約されません。状態を変更する HTTP メソッドと、If-Match や If-Unmodified-Since などのその他の HTTP 条件付きリクエストヘッダーは、このフィルターの範囲外です。コントローラーレベルの他の戦略では、計算を回避し、HTTP 条件付きリクエストをより広範にサポートできます。HTTP キャッシングを参照してください。

このフィルターには、次のような弱い ETag を書き込むようにフィルターを構成する writeWeakETag パラメーターがあります: W/"02a2d595e6ed9a0b24f027f2b63b134d6" (RFC 7232 セクション 2.3 [IETF] (英語) で定義)。

非同期リクエストをサポートするには、フィルターが最後の非同期ディスパッチの終わりまで ETag を遅延させて正常に生成できるように、このフィルターを DispatcherType.ASYNC にマップする必要があります。Spring Framework の AbstractAnnotationConfigDispatcherServletInitializer ( サーブレット構成を参照) を使用する場合、すべてのディスパッチ型に対してすべてのフィルターが自動的に登録されます。ただし、web.xml 経由でフィルターを登録する場合、または FilterRegistrationBean 経由で Spring Boot にフィルターを登録する場合は、必ず DispatcherType.ASYNC を含めてください。

CORS

Spring MVC は、コントローラーのアノテーションを介して CORS 構成をきめ細かくサポートします。ただし、Spring Security で使用する場合は、Spring Security の チェーンフィルターよりも先に並べ替える必要がある組み込みの CorsFilter を使用することをお勧めします。

詳細については、CORS および CORS フィルターのセクションを参照してください。