【问题标题】:scala play action composition response headerscala 播放动作组合响应标头
【发布时间】:2015-03-21 06:58:24
【问题描述】:

我通过读取请求标头使用操作组合进行 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`

【问题讨论】:

    标签: scala playframework http-headers


    【解决方案1】:

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

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

    block(new AuthorizedRequest(sh, request))
    

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

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

    【讨论】:

    • 感谢 Millhouse 的工作就像一个魅力。没有代码重复我正在重新发行新到期的令牌现在我可以简单地抽象出 api 密钥验证
    • @DipendraAdhikari 非常好。如果您能接受我的回答,我将不胜感激。祝你好运!
    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多