如何在Playframework 2 Scala中的路由处理之前修改请求的queryString和body?

时间:2015-06-05 05:20:48

标签: scala playframework routes

在我们的Web应用程序中,出于安全原因,查询字符串(用于GET请求)和请求正文(用于POST)由客户端加密,并应在playframework将请求路由到操作之前解密,之后响应在发送到客户端之前需要加密。加密/解密密钥可以从请求头中获取。

操作组合和过滤器不适用于此方案,因为控制器中定义的操作处理程序将检查参数类型。

我可以在Global的onRouteRequest方法中解密查询字符串,并使用解密的查询参数创建包装请求。但我不知道如何获得身体,因为只有一个参数" RequestHeader"在onRouteRequest方法中。

1 个答案:

答案 0 :(得分:1)

您可以编写自己的动作处理程序来预处理您的身体。

你基本上围绕你的行动包装另一个行动处理程序:

def index = Decrypt {
  Action { request =>
    Ok("Hello " + user.name)      
  }
}

Decrypt函数看起来像这样:

def Decrypt[A](action: User => Action[A]): Action[A] = {
  // Wrap the original BodyParser with authentication
  val decryptBodyParser = parse.using { request =>
    //decrypt stuff goes here...
  }
  // Now let's define the new Action
  Action(decryptBodyParser) { request =>
    action(request))
  }
}

注意:这是受文档启发的伪代码(链接如下)。它应该让你了解如何处理东西。

查看有关“ActionsComposition”的文档,并查看其“Authenticated” - 示例: https://www.playframework.com/documentation/2.0/ScalaActionsComposition