我是Play Framework的新手,我想实现一个拦截器或一个在请求进入Action类之前执行的过滤器。
如果某个标头变量不存在,我想要一个拦截器/过滤器来返回HTTP错误(例如401)。
我做了一些谷歌搜索,我发现了Filter(play.api.mvc.Filter)对象,但实现返回mvc.Result,而不是Response。
覆盖def apply(下一个:(mvc.RequestHeader)=> Future [mvc.Result])(request:mvc.RequestHeader)
我能想到的另一个解决方案是通过扩展ActionBuilder创建一个自定义的Action,但我宁愿不这样做,如果我可以设计一个捕获所有功能,如Filter。
任何帮助将不胜感激。谢谢。
答案 0 :(得分:6)
供将来参考。这是过滤器的实现。感谢tryx的帮助。
import play.api.mvc
import play.api.mvc.{RequestHeader, Filter}
import play.api.mvc.Results._
import scala.concurrent.ExecutionContext.Implicits.global
class AuthorizedFilter(requestHeader: RequestHeader) extends Filter {
private def authorizationRequired(request: mvc.RequestHeader) = {
request.headers.get("Authorized").
map( authorizedValue => authorizedValue.eq("ABCDEFG")).
getOrElse(false)
}
override def apply(next: (mvc.RequestHeader) => Future[mvc.Result])(request: mvc.RequestHeader) = {
if(authorizationRequired(request)) {
println("YOU are authorized!!")
next(request)
}
println("NOT AUTHORIZED!")
Future {Unauthorized }
}
}
在应用程序的根级别创建Filter对象。 (/应用)。
import javax.inject.Inject
import play.api.http.HttpFilters
class Filters @Inject() (authorizedFilter: AuthorizedFilter) extends HttpFilters {
def filters = Seq(authorizedFilter)
}
答案 1 :(得分:1)
在您的过滤器中有2个选项,您可以调用next
将控件传递给下一个过滤器,也可以显式返回Future[Result]
来终止链。如果您致电next
,最终过滤器链将结束,并且会到达操作。
听起来你想要一个像apply
方法一样的过滤器
apply(next: RequestHeader => Future[Result])(request: RequestHeader): Future[SimpleResult] = {
if (headersok){
next(request)
} else {
Future{ Unauthorized }
}
}