1

アプリケーションに複数のフィルターがあり、ルートに1つあります。

<filter>
    <filter-name>root</filter-name>
    <filter-class>
        my.own.classpath.RootFilter
    </filter-class>
</filter>

<filter>
    <filter-name>root</filter-name>
    <filter-class>
        my.own.classpath.SubFilter
    </filter-class>
</filter>

<filter-mapping>
    <filter-name>root</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>sub</filter-name>
    <url-pattern>/sub/*</url-pattern>
</filter-mapping>

Scalatra 2.0.0では、これは正常に機能しました。RootFilter(extends )にURLのバインディングがある場合ScalatraFilterはそれを処理し、そうでない場合は他のフィルターに渡されます。ただし、Scalatraの新しいバージョンでは、同じようには機能しません。で処理されるURLを指定するSubFilterと、正しいフィルターが呼び出されますが、結果のテキストは表示されません。代わりに、空白のページ(HTMLなし)が返されます。

これはScalatraのバグですか、それとも何か間違ったことをしていますか?

4

1 に答える 1

1

よくわかりませんが、ScalatraはJavaのペースで動かないので、状況は変わります。

これは、ScalatraServletとScalatraFilterのScalatraBookv2.0のスニペットです。特に、Not FoundとScalatraFilterがチェーン内の次のフィルターに委任することに関して、問題がどこにあるかについていくつかの手がかりがあるかもしれません(あなたの場合、subの後に次のフィルターはありません)

主な違いは、ルートが見つからない場合のデフォルトの動作です。ScalatraFilterは、チェーン内の次のフィルターまたはサーブレット(web.xmlで構成されている)に委任しますが、ScalatraServletは404応答を返します。

もう1つの違いは、ScalatraFilterがWARのコンテキストパスに関連するルートと一致することです。ScalatraServletは、サーブレットパスを基準にしたルートと一致します。これにより、同じWAR内の異なる名前空間に複数のサーブレットをマウントできます。

次の場合はScalatraFilterを使用します。

You are migrating a legacy application inside the same URL space
You want to serve static content from the WAR rather than a dedicated web server    

次の場合はScalatraServletを使用します。

You want to match routes with a prefix deeper than the context path.
于 2012-04-05T15:56:34.653 に答える