斯卡拉戏剧动作组成反应标题

时间:2015-03-21 06:58:25

标签: scala playframework http-headers

我正在通过读取请求标头使用动作组合来进行api授权。我想在响应头上注入身份验证令牌,以便客​​户端可以使用它在连续调用时调用API。到目前为止,我已经使用动作组合拦截了请求,我可以在获取控制器代码之前设置响应头,还是只能在控制器代码上完成?

可以在invokeBlock下面注入响应头吗?

def invokeBlock[A](request: Request[A], block: AuthorizedRequest[A] => Future[Result]): Future[Result] = { 
    val requestToken = sessionTokenPair(request)
    requestToken match {
      case Some(token) => { 
        AuthenticationManager.validateAPIToken(token).map { sh =>  
        block(new AuthorizedRequest(sh, request))
        }.getOrElse{
          Future.successful(Forbidden(Json.toJson(
            Error(status = Status.FORBIDDEN,errorCode = 43, message = "Bad Request",developerMessage="Issue")
           )))
        }
      }
      case _ => {
        Future.successful(Forbidden(Json.toJson(
            Error(status = Status.FORBIDDEN,errorCode = 43, message = "Bad Request",developerMessage="Issue")
           )))
      }}
    }
}`enter code here`

1 个答案:

答案 0 :(得分:0)

是的,invokeBlock是一个很好的地方 - 当然不需要在每个控制器中重复自己。

在你的“成功”案例中,你有:

block(new AuthorizedRequest(sh, request))

您实际上正在返回Future[Result]给您的block()。 要添加额外的标头,只需map Future,然后使用handy methods on Result添加:

block(new AuthorizedRequest(sh, request)).map { result =>
   result.withHeaders(
     "x-foo" -> "f00", 
     "x-bar" -> "bar")
}