3

まず、質問を処理する前に、テストケースを紹介します。私の基本的なMavenWebアプリケーションにはいくつかのコンポーネントがあります。

  • page.xhtml:リクエスト/リプライを生成するために使用されます(フィルタリングを開始するため)
  • Pretty Faces:クライアントのニーズに基づいてURLを再定義するために使用されます
  • FirstFilter:Pretty Facesの前に実行されます(テスト目的でこのスタジアムで)
  • ThirdFilter:Pretty Facesの後に実行されます(テスト目的でこのスタジアムで)
  • web.xml:完全なフィルターチェーンの動作を定義するには

重要なコンポーネントのコードを共有します。

pretty-config.xml

<url-mapping id="page">
    <pattern value="/page" />
    <view-id value="/page.xhtml" />
</url-mapping>

FirstFilter.java

@WebFilter
public class FirstFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("FirstFilter, request: " + 
                ((HttpServletRequest)request).getRequestURL().toString());
        chain.doFilter(request, response);
        System.out.println("FirstFilter, response");
    }

    // override init and destroy
}

ThirdFilter.java

@WebFilter
public class ThirdFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("ThirdFilter, request: " + 
                ((HttpServletRequest)request).getRequestURL().toString());
        chain.doFilter(request, response);
        System.out.println("ThirdFilter, response");
    }

    // override init and destroy
}

web.xml

<filter>
    <filter-name>FirstFilter</filter-name>
    <filter-class>nl.mhoogeveen.nl.rootapplication.FirstFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>FirstFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>Pretty Filter</filter-name>
    <filter-class>testingapplications.filterchaining.PrettyFilter</filter-class>
    <async-supported>true</async-supported>
</filter>
<filter-mapping>
    <filter-name>Pretty Filter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
    <dispatcher>ASYNC</dispatcher>
</filter-mapping>
<filter>
    <filter-name>ThirdFilter</filter-name>
    <filter-class>testingapplications.filterchaining.ThirdFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>ThirdFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

状況

localhost:8080 / page.xhtmlを呼び出します(したがって、Pretty Facesリダイレクトをアクティブ化しません)

INFO: FirstFilter, request: http://localhost:8080/page.xhtml
INFO: ThirdFilter, request: http://localhost:8080/page.xhtml
INFO: ThirdFilter, response
INFO: FirstFilter, response

localhost:8080 / pageを呼び出します(したがって、Pretty Facesリダイレクトをアクティブにします)

INFO: FirstFilter, request: http://localhost:8080/page
INFO: FirstFilter, response

質問

私のチェーンが不完全になるこの状況の原因は何ですか?FirstFilterで応答が得られるため、切断されません。それはThirdFilterに到達していないようです。

私に何か問題がありますか、私web.xmlは行方不明dispatcherですか?

前もって感謝します。

4

1 に答える 1

7

コーディネーターの設定が正しくありません。何が起こるか説明させてください:

のリクエストが/page届き、最初にによって処理されFirstFilterます。その後、PrettyFacesはリクエストをインターセプトし、に転送し/page.xhtmlます。この転送されたリクエストは新しいリクエストとして処理されるため、フィルタチェーンを再度検討します。ただし、フィルターには、設定と同じディスパッチャー設定はありません<dispatcher>REQUEST</dispatcher>。この構成では、フィルターは通常の要求にのみ適用され、転送された要求には適用されません。

転送されたリクエストにもフィルターを適用する場合は<dispatcher>FORWARD</dispatcher>、フィルター構成に追加する必要があります。

これは、通常、MyFaces Tomahawk/PrimeFacesなどのサードパーティフィルターのディスパッチャー設定を調整する必要がある理由でもあります。FAQの質問2を参照してください。

http://ocpsoft.org/prettyfaces/#section-16

于 2012-10-25T11:59:28.380 に答える