Scala播放会话值未保存

时间:2015-04-10 09:18:44

标签: scala session playframework

所以我正在使用IntelliJ 14.1.1开发使用Play 2.3的Scala中的webapp。

问题在于在会话中存储值。我目前有这个:

def authCredentials = Action { implicit request =>
  loginForm.bindFromRequest.fold(
        formWithErrors => BadRequest(views.html.login(formWithErrors.withError("badlogin","Username or password is incorrect."))),
        goodForm => Redirect(routes.AccountController.display).withSession(request.session + ("username" -> goodForm._1))
    )
}

然后在我的AccountController中:

  def display = Action { implicit request =>
    request.session.get("username").map { username =>
      Ok(views.html.account(User.getUser(username))).withSession(request.session + ("username" -> username))
    }.getOrElse(Redirect(routes.LoginController.login)).withNewSession
  }

现在在上面的函数中,它只找到用户名并只渲染一次帐户页面。问题出现之后,当我想从帐户页面导航到一个页面,例如更改密码页面,甚至刷新帐户页面时,它将重新定向回新的会话登录。

我做错了什么,是否有更好的方法来检查会话是否经过身份验证以访问页面,而不是在每个显示功能上重复代码。

1 个答案:

答案 0 :(得分:1)

这似乎是一个简单的括号问题,请尝试:

def display = Action { implicit request =>
  request.session.get("username").map { username =>
  Ok(views.html.account(User.getUser(username))).withSession(request.session + ("username" -> username))
  }.getOrElse(Redirect(routes.LoginController.login).withNewSession)
}

您实际上是在控制器中重置了会话,现在withNewSession调用位于getOrElse内,只有在没有用户名的情况下才会发送新会话发现当前的一个。