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で利用可能]です。