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

Posted

技术标签:

【中文标题】我将如何在播放框架 2.4.3 (Scala) 中实现拦截器/过滤器【英文标题】:How would I implement an Interceptor/Filter in play framework 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 功能。

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

【问题讨论】:

【参考方案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 
  

【讨论】:

以上是关于我将如何在播放框架 2.4.3 (Scala) 中实现拦截器/过滤器的主要内容,如果未能解决你的问题,请参考以下文章

用于播放框架 2 的 Scala 插件

在scala播放框架异步操作中组合/链接未来

播放框架 2.4.3 进化未触发

如何在scala play框架中停止执行或抛出错误

如何在播放框架应用程序中进行完整的集成测试?

twitter4s:如何在播放框架中从 Action.async 返回未来