Как я могу использовать параметры в предварительном фильтре в Scalatra?

У меня есть глобальный фильтр, который я хотел бы реализовать в своем API на основе скалятры. Для простоты я хочу, чтобы ЛЮБОЙ вызов API, имеющий переменную foo с полосой значений, выдавал 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 всегда пуста, независимо от того, есть ли параметр или нет. Есть ли лучший подход или есть другой метод для извлечения параметров из предварительного фильтра?


person Victor 'Chris' Cabral    schedule 29.10.2013    source источник


Ответы (1)


Параметры не заполняются при использовании метода 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)
        }
    }
}
person Victor 'Chris' Cabral    schedule 30.10.2013