2017-07-30 10 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を更新する必要はなく、次のリクエストで新しい匿名ユーザーが作成されます。したがって、withSessionを追加するアクションのResultを更新するか、永続的なCookieをインストールすることをお勧めします(ユーザーがブラウザタブを閉じたときに削除されません)。

それ以外の場合は、あなたがまだあなたのUserRequestにいる場合、あなたがユーザーのメールとのセッションを更新する理由がわかりません。

あなたの質問には、あなたのコードは、プレイドキュメントのものと非常によく似ています。Scala action compositionです。同じページに、いくつかのフィールドを変更して新しいリクエストを作成する方法が示されています。あなたの場合

、それは

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

ようになります私は、機能を必要としないことになったし、代わりにクッキーを使用していました。私は、すべてのリクエストでクッキーをチェックし、それが存在しない場合はそれを作成するフィルターを使用しました。私はまた、上記の方法を試したと信じて、それは動作しませんでした。セッションは変更されません。この質問を閉じるために、私は後でそれを打ち明けます。 – decapo

+0

私が書いたように、さらにセッションを通過できる新しいSessionオブジェクトが作成されます。しかし、私の答えの大きな部分は、実際のユーザーセッションは変更されないと言います。だから私は、あなたが非常に奇妙で、おそらく間違っていることを見つけましたが、実際の質問を解決します。 – SeriousDron

関連する問題