2012-03-29 3 views
1

Apache Tomcatバージョン7.0.26が動作しています。Tomcatのサーブレット上のフィルタの優先順位

JAX-RSサーブレットは/ testの下にあり、tournでTomcatサーブレットエンジンによって処理されるべきjspを呼び出します。

など、 /testはジャージーで処理する必要がありますが、/test/result.jspはJSPエンジンで処理する必要があります。

私はユーザーに別のURLを見せたくないので、jsp URLを/ jspに内部的に書き換えます。

構成は、そのようなものである:(urlrewrite.xmlで)

UrlRewriteFilter

<rule> 
    <from>^/([^j][^s][^p].*\.jsp)</from> 
    <to>/jsp/$1</to> 
</rule> 

web.xml

<filter> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
    <!-- set the amount of seconds the conf file will be checked for reload 
    can be a valid integer (0 denotes check every time, 
     empty/not set denotes no reload check) --> 
    <init-param> 
    <param-name>confReloadCheckInterval</param-name> 
    <param-value>0</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

<servlet> 
    <servlet-name>Test</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>test</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Test</servlet-name> 
    <url-pattern>/test/*</url-pattern> 
</servlet-mapping> 

/xyz.jspにコールが/jsp/xyz.jspにリダイレクトされます。 /test/xyz.jspへの電話は404 - Servlet Test is not availableにつながります。私はフィルタがサーブレットよりも優先されると思っていましたか?

私は関連する質問Servlet vs Filterを知っていますが、優先順位について何も述べていません。

BTW:PrettyFacesはUrlRewriteFilterと似ているようですが、まだ試していません。私は(現在)よりUrlRewriteFilterのようです。

EDIT:質問How to mix server-side Jax-rs call with native files without prefix?は私の質問の背後にある質問をします。

答えて

1

実際には非常に簡単に動作させることができ、URLの書き換えは不要です。 JSPをサーブレットの代わりにサーブレット・フィルタとして登録します。つまり、サーブレットサーブレットのすべてをフィルタと置き換え、com.sun.jersey.config.featureを追加します。 FilterForwardOn404 init paramをtrueに設定します。結果のweb.xmlは次のようになります。

<filter> 
    <filter-name>Test</filter-name> 
    <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class> 
    <init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>test</param-value> 
    </init-param> 
    <init-param> 
    <param-name>com.sun.jersey.config.feature.FilterForwardOn404</param-name> 
    <param-value>true</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>Test</filter-name> 
    <url-pattern>/test/*</url-pattern> 
</filter-mapping> 
+0

素晴らしいです。各ジャージーフィルターの '@ PATH'指示文を適合させるために注意を払わなければなりません。 – koppor

+0

一方、パラメータとしてjspファイルを含むViewableを返します。私はFilterForwardOn404もオフにしました。通常のコードでは、コードによって作成された404も前方につながります。これは必ずしも望ましいものではありません(設定に応じて)。 – koppor

+0

filter-mappingを使用してベースURLを指定できますか? –

0

このような設定はうまくいかないようです。すべての残りのサービスを/restに置き換え、すべてのjspを/jspの下に置きます。

関連する問題