春のDelegatingFilterProxyの概要と必要性
1概要
__DelegatingFilterProxy
は、Springアプリケーションコンテキストにアクセスできる
Filter__クラスに制御を渡すことを可能にするサーブレットフィルタです。 Spring Securityはこの手法に大きく依存しています。
このチュートリアルでは、詳しく説明します。
2
DelegatingFilterProxy
DelegatingFilterProxy
のJavadocには、
Filterインタフェースを実装するSpring管理Beanに委任する、標準サーブレットフィルタ用のプロキシ。
サーブレットフィルタを使用するとき、明らかにそれらを我々のJava-configまたは
web.xmlで
filter-class
として宣言する必要があります。 Springの
DelegatingFilterProxy
は、
web.xml__とアプリケーションコンテキストの間のリンクを提供します。====
2.1.
__ DelegatingFilterProxy
__の内部作業
DelegatingFilterProxy
がSpring Beanに制御を渡す方法を見てみましょう。初期化中に、
DelegatingFilterProxy
は
filter-name
をフェッチし、その名前のBeanをSpringアプリケーションコンテキストから取得します。このBeanは、タイプ
_javax.Servlet.Filter、
_
i.eでなければなりません。 「通常の」サーブレットフィルタその後、着信要求はこのフィルターBeanに渡されます。つまり、
DelegatingFilterProxyの
doFilter()
メソッドはすべての呼び出しをSpring Beanに委任し、私たちのフィルターBean内ですべてのSpring機能を使用できるようにします。Javaベースの設定を使用している場合、
ApplicationInitializer
のフィルタ登録は次のように定義されます。@Override protected javax.servlet.Filter[]getServletFilters() { DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy(); delegateFilterProxy.setTargetBeanName("applicationFilter"); return new Filter[]{delegateFilterProxy}; }
XMLを使用する場合は、
web.xml
ファイルで次のようにします。<filter> <filter-name>applicationFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter>
これは、
applicationFilter
という名前のSpring Beanとして定義されたフィルタを通過するように要求を送信できることを意味します。====
2.2.
DelegatingFilterProxy
が必要です
DelegatingFilterProxy
は、SpringのWebモジュールのクラスです。これは、HTTP呼び出しを実際の宛先に到達する前にフィルターを通過させるための機能を提供します。
DelegatingFilterProxyの助けを借りて、
javax.Servlet.Filter
__インターフェースを実装するクラスをフィルターチェーンに配線することができます。一例として、Spring Securityは
DelegatingFilterProxy
を利用して、セキュリティフィルタ用のSpringの依存性注入機能とライフサイクルインターフェースを利用することができます。
DelegatingFilterProxy
は、Springのアプリケーションコンテキストまたは__web.xmlで設定を提供することで、リクエストURIパスに従って特定のフィルタまたは複数のフィルタを呼び出すことも利用します。===
3カスタムフィルタの作成
前述のように、
DelegatingFilterProxy
は、
Filter
インタフェースを実装する特定のSpring管理Beanに委任するサーブレットフィルタ自体です。次のいくつかのセクションでは、カスタムフィルタを作成し、Javaを使用して設定します。
====
3.1. フィルタークラス
リクエストがさらに進む前に、リクエスト情報を記録する単純なフィルタを作成します。
まずカスタムフィルタクラスを作成しましょう。
@Component("loggingFilter") public class CustomFilter implements Filter { private static Logger LOGGER = LoggerFactory.getLogger(CustomFilter.class); @Override public void init(FilterConfig config) throws ServletException { //initialize something } @Override public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; LOGGER.info("Request Info : " + req); chain.doFilter(request, response); } @Override public void destroy() { //cleanup code, if necessary } }
CustomFilter
は
javax.Servlet.Filter
を実装しています。このクラスには、アプリケーションコンテキストでSpring Beanとして登録するための
@ Component
アノテーションがあります。このように、
DelegatingFilterProxy
クラスはフィルタチェーンを初期化している間に私たちのフィルタクラスを見つけることができます。
Spring Beanの名前は、
ApplicationInitializer
クラスまたは後で
web.xmlにカスタムフィルタを登録するときに指定された
filter-name
の値と同じである必要があります。
** DelegatingFilterProxyクラスはフィルタを検索するためです。アプリケーションコンテキストでまったく同じ名前のBean。この名前のBeanが見つからないと、アプリケーションの起動時に例外が発生します。
====
3.2. Java設定を介したフィルタの設定
Java設定を使ってカスタムフィルタを登録するには、
AbstractAnnotationConfigDispatcherServletInitializer
の
getServletFilters()
メソッドをオーバーライドする必要があります。public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { //some other methods here @Override protected javax.servlet.Filter[]getServletFilters() { DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy(); delegateFilterProxy.setTargetBeanName("loggingFilter"); return new Filter[]{delegateFilterProxy}; } }
====
3.3.
web.xml
によるフィルタの設定
web.xml
のフィルタ設定がどのようになるかを見てみましょう。<filter> <filter-name>loggingFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>loggingFilter</filter-name> <url-pattern>/** </url-pattern> </filter-mapping>
filter-class
引数は
DelegatingFilterProxy
型であり、作成したフィルタクラスではありません。このコードを実行して任意のURLにアクセスすると、
CustomFilter
の
doFilter()
メソッドが実行され、要求情報の詳細がログファイルに表示されます。===
4結論
この記事では、
DelegatingFilterProxy
の機能と使用方法について説明しました。Spring SecurityはWeb API呼び出しとリソースを不正アクセスから保護するために
DelegatingFilterProxy
を多用しています。ソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-5-mvc[GitHubで利用可能]です。