【问题标题】:Play 2.2 for Scala: is it possible to modify the session of an incoming request?Play 2.2 for Scala:是否可以修改传入请求的会话?
【发布时间】:2013-12-01 21:23:41
【问题描述】:

我正在尝试使用动作组合将假用户添加到 Session。

def GuestAction(f: Request[AnyContent] => Result): Action[AnyContent] = {
  Action { request =>
    var myUser = searchUser(request.session)
    if ( myUser == null ) {
       myUser = newUser()
    }
    f(request).withSession("user" -> myUser)
  }
}

在我的控制器中有

def action1 = GuestAction { implicit request =>
   // My code
   Ok()
}

def action2 = GuestAction { implicit request =>
   val user = request.session.get("user").get
   // My code
   Ok()
}

当我打开 Chrome 并浏览指向“action1”的路由,然后浏览指向“action2”的路由时,一切正常:我有一个新用户,它已附加到会话。 相反,当我打开 Chrome 并首先浏览指向“action2”的路由时,我收到一个错误,因为我的“request.session”是空的,这很明显:使用.withSession() 会话附加到@ 987654324@,而不是传入的请求。 因此,为了完成这项工作,我需要将会话键/值对附加到传入请求中 - 就像在 FakeRequest.withSession() 中一样,但在 Request 中没有这样的方法。

为了解决这个问题,您有什么建议?

【问题讨论】:

    标签: scala playframework playframework-2.2


    【解决方案1】:

    你已经快到了 - 但要从你的动作组合中获得最大价值,你应该能够让你的“客户”动作完全不知道会话 - 毕竟他们真的只关心 User 对象.你希望能够写:

    def action2 = GuestAction { implicit user => implicit request => 
      // Do something with 'user', whether it's a guest or real
      println(s"My user is $user")
      Ok()
    }
    

    action2 不关心User 是如何获得的,但它可以依赖一个可用的。要做到这一点,GuestAction 需要是这样的:

    def GuestAction(f: (User) => Request[AnyContent] => Result): Action[AnyContent] = {
      Action { request =>
        var myUser = searchUser(request.session)
        if ( myUser == null ) {
          myUser = newUser()
        }
        f(myUser)(request)
      }
    }
    

    剩下的唯一难题是将用户放入会话 - 作为成功登录过程的一部分,您仍然可以使用传统的 response.withSession() 来完成。

    【讨论】:

    • 这正是我想要的!
    猜你喜欢
    • 2016-03-18
    • 2016-04-17
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多