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(which extends ScalatraFilter) 有一个 url 的绑定,它会处理它,否则它会传递给其他过滤器。但是,在更高版本的 Scalatra 中,它的工作方式不同。当我提供由 处理的 url 时SubFilter,仍会调用正确的过滤器,但不会显示结果文本。而是返回一个空白页面(没有 HTML)。

这是Scalatra中的错误,还是我做错了什么?

4

1 回答 1

1

我不确定,Scalatra 并没有以 Java 的速度发展,所以事情发生了变化。

这是 Scalatra Book v2.0 关于 ScalatraServlet 与 ScalatraFilter 的一个片段;这里可能有一些关于问题所在的线索,特别是关于 Not Found 和 ScalatraFilter 委托给链中的下一个过滤器(在你的情况下,在 sub 之后没有下一个过滤器)

主要区别在于找不到路由时的默认行为。ScalatraFilter 将委托给链中的下一个过滤器或 servlet(由 web.xml 配置),而 ScalatraServlet 将返回 404 响应。

另一个区别是 ScalatraFilter 匹配相对于 WAR 上下文路径的路由。ScalatraServlet 匹配相对于 servlet 路径的路由。这允许您在同一个 WAR 的不同名称空间下挂载多个 servlet。

在以下情况下使用 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 回答