【问题标题】:Change in scalatra filter behaviorscalatra 过滤器行为的变化
【发布时间】:2026-01-13 00:30:01
【问题描述】:

我的应用程序中有多个过滤器,其中一个位于根目录。

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

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

【问题讨论】:

  • 您使用的是哪个版本的 Scalatra? 2.10 开发,2.0.4 稳定,还是其他? (读起来像一条记录的消息;-))
  • 我的网站在 Scalatra 2.0.0 上“工作”。我的网站在 Scalatra 2.0.1 和 2.0.4 上“不起作用”。我将这些短语放在引号中是因为我不确定我是在利用错误还是功能——尽管我认为是后者。

标签: scala scalatra


【解决方案1】:

我不确定,Scalatra 并没有跟上 Java 的步伐,所以情况发生了变化。

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

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

另一个区别是 ScalatraFilter 匹配相对于 WAR 的上下文路径。 ScalatraServlet 匹配相对于 小服务程序路径。这允许您在 in 下挂载多个 servlet 同一 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.

【讨论】:

  • 是的,所以第一部分建议我正在做的事情应该工作(委托给下一个过滤器),第二部分建议它不应该工作(匹配更深的前缀)。
  • ;-) 我喜欢 Scalatra,但需要进行一些挖掘,没有一个维护者(直接)获得报酬。文档很好,但不是很好。恕我直言,它是最易于访问/最实用的 Scala 微框架(Spray & Unfiltered 很好地涵盖了无状态 REST 利基,但 Scalatra 通常不会妨碍您,如果您需要,它会为您提供状态,并且超级易于变形为 MVC 堆栈)。无论如何,很高兴能得到一些帮助!