2012-04-04 18 views
1

我在我的应用程序中有多个过滤器,一个在根。scalatra过滤器行为的变化

<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> 

在斯卡拉特拉2.0.0这工作正常。如果RootFilter(它扩展了ScalatraFilter)有一个url绑定它将处理它,否则它会传递给其他过滤器。但是,在更高版本的Scalatra中,它的工作原理不一样。当我提供一个由SubFilter处理的url时,仍然调用正确的过滤器,但不显示生成的文本。而是返回空白页面(不含HTML)。

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

+1

什么版本了Scalatra的是你吗? 2.10开发,2.0.4稳定还是别的? (读取像录制的消息;-)) – virtualeyes 2012-04-05 08:38:41

+0

我的网站“工程”Scalatra 2.0.0。我的网站在Scalatra 2.0.1和2.0.4上“不起作用”。我把这些短语放在引号中,因为我不确定我是否利用了一个错误或一个功能 - 尽管我认为它是后者。 – schmmd 2012-04-05 15:37:34

回答

1

我不确定,Scalatra不会以Java的速度移动,所以事情会改变。

这是ScalatraServlet与ScalatraFilter的Scalatra Book v2.0的一个片段;可能会有一些线索在这里为问题所在,特别是在考虑到未找到和ScalatraFilter委托给在链中的下一个过滤器(在你的情况下,有子后,没有一个过滤器)

主要差异是未找到路由时的默认行为。 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. 
+0

是的,所以第一部分表明我在做什么应该工作(委托给下一个过滤器),第二部分表明它不应该工作(匹配更深的前缀)。 – schmmd 2012-04-05 15:58:38

+0

;-)我喜欢Scalatra,但需要一些挖掘,没有维护者支付(直接)。文档很好,但不是很好。恕我直言,它是最容易访问/碰到地面运行的Scala微型框架(Spray&Unfiltered具有无状态的REST适当位置,但Scalatra通常会超出你的方式,给你状态,如果你想要它,并且超级容易变身为MVC堆栈)。无论如何,很高兴得到了一些帮助! – virtualeyes 2012-04-05 16:29:27