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

如何在play framework 2.4.3(Scala)中实现拦截器/过滤器,scala,playframework-2.4,Scala,Playframework 2.4,我对Play框架是新手,我想实现一个拦截器或过滤器,在请求进入Action类之前执行该拦截器或过滤器 我想要一个拦截器/过滤器,如果某个头变量不存在,它将返回HTTP错误(例如401) 我在谷歌上搜索了一下,发现了Filter(play.api.mvc.Filter)对象,但实现返回的是mvc.Result,而不是响应 覆盖def apply(next:(mvc.RequestHeader)=>Future[mvc.Result])(请求:mvc.RequestHeader) 我能想到的另一个解

我对Play框架是新手,我想实现一个拦截器或过滤器,在请求进入Action类之前执行该拦截器或过滤器

我想要一个拦截器/过滤器,如果某个头变量不存在,它将返回HTTP错误(例如401)

我在谷歌上搜索了一下,发现了Filter(play.api.mvc.Filter)对象,但实现返回的是mvc.Result,而不是响应

覆盖def apply(next:(mvc.RequestHeader)=>Future[mvc.Result])(请求:mvc.RequestHeader)

我能想到的另一个解决方案是通过扩展ActionBuilder来创建自定义操作,但如果我能设计一个像Filter这样的全面功能,我宁愿不这样做


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

在您的过滤器中,您有两个选项,您可以调用
next
,将控制权传递给下一个过滤器,或者您可以显式返回
Future[Result]
,终止链。如果调用
next
,过滤器链最终将结束并到达操作

听起来您需要一个带有
apply
方法的过滤器,如


}

供将来参考。这是过滤器的实现。谢谢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 }
    }
}
在应用程序的根级别创建筛选器对象。(/app)

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 }
    }
}
import javax.inject.Inject

import play.api.http.HttpFilters

class Filters @Inject() (authorizedFilter: AuthorizedFilter) extends HttpFilters {

  def filters = Seq(authorizedFilter)
}