scala play 动作组合响应 header

scala play action composition response header

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

可以将响应 header 注入到下面的 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`

是的,invokeBlock 是执行此操作的好地方 - 当然无需在每个控制器中重复自己。

在您的 "success" 案例中,您有:

block(new AuthorizedRequest(sh, request))

你实际上是在返回 block() 给你的 Future[Result]。 要添加额外的 headers,只需 map 覆盖 Future 并使用 handy methods on Result:

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