2017-07-30 78 views
2

我遵循播放框架和動作組合的文檔。我的動作會檢查當前會話以查看用戶是否存在,如果有的話返回UserRequest,如果不是,我想創建一個訪客用戶,將它們存儲在請求的會話中並返回帶有更新會話的UserRequest。Play Framework如何更新請求中的會話

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

首先,Request對象的會話字段不僅僅是字段,它是從用戶的cookie計算得出的惰性字段。

因此,使用可以更新請求,使其具有另一個會話,但不會更新用戶cookie,下一個請求會爲您創建一個新的匿名用戶。因此,您可能需要更新Result的Action,並在該處添加withSession或者安裝永久性Cookie(因此在用戶關閉瀏覽器選項卡時不會將其刪除)。

否則,我不確定爲什麼你想更新與用戶電子郵件會話,如果你已經在你的UserRequest

在你的問題 - 你的代碼是非常相似Scala action composition播放文檔中的一個。並且在同一頁上,它顯示瞭如何創建一個新的請求,其中一些字段被更改。

在你的情況下,它會像

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

我結束了不需要的功能和使用cookie而不是。我確實使用了一個過濾器來檢查每個請求上的cookie,然後創建它,如果它不存在。我也相信我嘗試了上面的方法,但沒有奏效。會議不會改變。爲了解決這個問題,我稍後會給出一個答案。 – decapo

+0

正如我寫的,它會創建新的會話對象,您可以進一步傳遞。但是,我的答案很大一部分說它不會改變實際的用戶會話。所以我發現你想做的事很奇怪,可能是錯誤的,但是,它解決了你的實際問題。 – SeriousDron

相關問題