繁体   English   中英

我如何在play框架2.4.3(Scala)中实现拦截器/过滤器

[英]How would I implement an Interceptor/Filter in play framework 2.4.3 (Scala)

我是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这样的所有功能。

任何帮助将不胜感激。 谢谢。

备查。 这是过滤器的实现。 感谢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)
}

在您的过滤器中有2个选项,您可以调用next将控制传递给下一个过滤器,也可以显式返回Future[Result]来终止链。 如果你打电话给next ,最终过滤链将结束并且它将到达动作。

听起来你想要一个带有apply方法的过滤器

apply(next: RequestHeader => Future[Result])(request: RequestHeader): Future[SimpleResult] = {
  if (headersok){
    next(request)
  } else {
    Future{ Unauthorized }
  }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM