【问题标题】:How to modify queryString and body of the request before being processed by the routes in Playframework 2 Scala?如何在 Playframework 2 Scala 中的路由处理之前修改请求的 queryString 和正文?
【发布时间】:2015-06-05 05:20:47
【问题描述】:

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

动作组合和过滤器不适用于这种情况,因为控制器中定义的动作处理程序将检查参数类型。

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

【问题讨论】:

    标签: scala playframework routes


    【解决方案1】:

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

    你基本上在你的动作周围包装了另一个动作处理程序:

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

    解密函数可能如下所示:

    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

    【讨论】:

    • ActionsComposition 可以在请求被路由到控制器中的处理程序后使用。但是,我希望查询字符串解密和正文解密在同一个地方,如果我使用动作组合,这意味着参数已经解密,否则密文(这是一个字符串)无法转换为参数的正确类型(例如 def index(page: Int) .
    • 相信你得分开处理。您可以将这两个函数放入同一个类/对象中,这样它们就“在同一个地方”,然后从 Global.scala 调用它们一次,每个 Action 调用一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多