【问题标题】:Play Framework How to update a the session within a requestPlay Framework 如何在请求中更新会话
【发布时间】:2017-07-30 23:09:23
【问题描述】:

我正在关注游戏框架和动作组合的文档。我的操作会检查当前会话以查看用户是否存在,如果存在则返回 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 不是请求对象上定义的方法。有没有办法修改请求对象上的会话?

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    首先,Request 对象的 session 字段不仅仅是字段,它是根据用户的 cookie 计算出来的惰性字段。

    因此使用可以更新请求以使其具有另一个会话,但您不会以这种方式更新用户 cookie,并且下一个请求将为您创建一个新的匿名用户。所以你可能想更新Result的Action添加withSession那里或安装永久cookie(所以当用户关闭他的浏览器选项卡时它不会被删除)。

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

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

    在你的情况下,它会像

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

    【讨论】:

    • 我最终不需要该功能,而是使用了 cookie。我确实使用了一个过滤器来检查每个请求的 cookie,如果它不存在则创建它。我也相信我尝试了上面的方法,但没有奏效。会议不会改变。为了结束这个问题,我稍后会试一试。
    • 正如我所写的,它将创建新的 Session 对象,您可以进一步传递。但正如我的大部分回答所说,它不会改变实际的用户会话。所以我发现你想做的事情很奇怪而且可能是错误的,但它解决了你的实际问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多