0

我有一个全局过滤器,我想在基于 scalatra 的 API 中实现它。为了简单起见,我希望任何具有变量 foo 和值 bar 的 API 调用都抛出 403。我从继承链开始这个问题。

class NoFooBarRouter extends ScalatraServlet{
    before() {
        if(params.getOrElse("foo", "") == "bar") //params is empty here. 
            halt(403, "You are not allowed here")
        else
            pass()
    }  
}

class APIRouter extends NoFooBarRouter{
    get("/someurl/:foo") {
        "Hello world!"
    }        
}

这不起作用。在调试过程中,我注意到无论是否有参数,params 变量始终为空。是否有更好的方法或者是否有另一种方法可以从之前的过滤器中提取参数?

4

1 回答 1

2

在 before 方法中没有填写参数。您可以覆盖调用方法。

class NoFooBarRouter extends ScalatraServlet{
    override def invoke(matchedRoute: MatchedRoute): Option[Any] = {
        withRouteMultiParams(Some(matchedRoute)){
            val foo = params.getOrElse("foo", "")
            if(foo =="bar")
                halt(403, "You are not authorized for the requested client.")
            else
                NoFooBarRouter.super.invoke(matchedRoute)
        }
    }
}
于 2013-10-30T00:00:04.150 回答