Play Framework如何更新请求中的会话

时间:2017-07-30 23:09:23

标签: scala playframework

我正在关注游戏框架和动作组合的文档。我的操作检查当前会话以查看用户是否存在,如果返回UserRequest,如果不存在,我想创建访客用户,将它们存储在请求的会话中,并返回带有更新会话的UserRequest。

class UserRequest[A](val email: String, request: Request[A]) extends WrappedRequest[A](request)

class UserAction @Inject()(val parser: BodyParsers.Default, dbConfigProvider: DatabaseConfigProvider)(implicit val executionContext: ExecutionContext)
  extends ActionBuilder[UserRequest, AnyContent] with ActionTransformer[Request, UserRequest] {

  val userRepo = new UserRepository(dbConfigProvider)(executionContext)

  def transform[A](request: Request[A]) = {
    request.session.get("user") match {
      case None        => createGuestUser(SecureRandomUtil.generateSecureRandom(24)).map { u => 
        new UserRequest(u.email, request.withSession("user"->u.email))
      }
      case Some(email) => Future.successful(new UserRequest(email,  request))
    }
  }

但是,withSession不是请求对象上定义的方法。有没有办法修改请求对象上的会话?

1 个答案:

答案 0 :(得分:0)

首先,Request对象的会话字段不仅仅是字段,它是根据用户Cookie计算的懒惰字段。

因此,使用可以更新请求以使其具有另一个会话,但您不会以这种方式更新用户cookie,下一个请求将创建一个新的匿名用户。因此,您可能希望更新Result添加withSession的操作或安装永久Cookie(因此当用户关闭其浏览器标签时不会将其删除)。

否则,如果您已在UserRequest中使用,我不确定您为什么要使用用户电子邮件更新会话。

关于您的问题 - 您的代码与关于Scala action composition的游戏文档非常相似。在同一页面上,它显示了如何创建一个更改了某些字段的新请求。

在你的情况下,它会像

new WrappedRequest[A](request) {
  override val session = request.session + ("user" -> u.email)
}