我正在关注游戏框架和动作组合的文档。我的操作检查当前会话以查看用户是否存在,如果返回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不是请求对象上定义的方法。有没有办法修改请求对象上的会话?
答案 0 :(得分:0)
首先,Request
对象的会话字段不仅仅是字段,它是根据用户Cookie计算的懒惰字段。
因此,使用可以更新请求以使其具有另一个会话,但您不会以这种方式更新用户cookie,下一个请求将创建一个新的匿名用户。因此,您可能希望更新Result
添加withSession
的操作或安装永久Cookie(因此当用户关闭其浏览器标签时不会将其删除)。
否则,如果您已在UserRequest
中使用,我不确定您为什么要使用用户电子邮件更新会话。
关于您的问题 - 您的代码与关于Scala action composition的游戏文档非常相似。在同一页面上,它显示了如何创建一个更改了某些字段的新请求。
在你的情况下,它会像
new WrappedRequest[A](request) {
override val session = request.session + ("user" -> u.email)
}