【问题标题】:How would I implement an Interceptor/Filter in play framework 2.4.3 (Scala)我将如何在播放框架 2.4.3 (Scala) 中实现拦截器/过滤器
【发布时间】:2015-11-17 23:33:59
【问题描述】:

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

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

我做了一些谷歌搜索,发现了 Filter (play.api.mvc.Filter) 对象,但实现返回的是 mvc.Result,而不是 Response。

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

我能想到的另一个解决方案是通过扩展 ActionBuilder 来创建自定义的 Action,但我宁愿不这样做,如果我可以设计一个像 Filter 这样的 catch all 功能。

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

【问题讨论】:

    标签: scala playframework-2.4


    【解决方案1】:

    供日后参考。这是过滤器的实现。感谢 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 javax.inject.Inject
    
    import play.api.http.HttpFilters
    
    class Filters @Inject() (authorizedFilter: AuthorizedFilter) extends HttpFilters {
    
      def filters = Seq(authorizedFilter)
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-21
        • 2014-06-16
        • 2016-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-27
        相关资源
        最近更新 更多