即使会话已关闭,也要存储Cookie

时间:2012-04-18 15:35:13

标签: session-cookies playframework-2.0

Play的最佳方法是什么!应用程序记住用户?我认为唯一可行的解​​决方案是使用客户端cookie,对吧?但是一旦浏览器关闭,此会话就会被销毁,对下一个请求无效?你怎么解决(d)这个?

至于现在,我在会话中(每个会话)收取加密的userid,如下所示:

session("userid", user.id);

然后我使用拦截器来避免每当我需要它时传递参数,如下所述:How to avoid passing parameters everywhere in play2?

但是,如何记住用户,甚至是在下次请求时自动登录用户

编辑:2016-03-11 请注意,某些浏览器可能会将会话cookie存储更长时间。例如,您可以在Chrome中设置以记住下次访问时打开的标签页。这意味着下次打开浏览器时将恢复Play Session cookie。

自Play 2.4起,会话cookie maxAge(您需要在application.conf中设置)重命名为:play.http.session.maxAge

4 个答案:

答案 0 :(得分:5)

要在用户关闭浏览器时使会话没有超时,您可以使用application.conf中的session.maxAge参数。

e.g:

# Set session maximum age in seconds (4w)
session.maxAge=2419200 

答案 1 :(得分:1)

引自Play 2.0 Session Documentation

  

会话没有技术超时。它在用户关闭Web浏览器时到期。如果您需要特定应用程序的功能超时,只需将时间戳存储到用户会话中,然后根据您的应用程序需要使用它(例如,最长会话持续时间,最大不活动持续时间等)。

出于安全原因,现代浏览器会在退出时使Cookie无效,而这不是您可以更改的原因,因为它会让黑客利用他们不合法拥有的凭据来处理坏事。

我会重新评估您真正是否希望用户保持登录状态,因为这样做通常会带来安全风险。但是,如果您决定仍然希望用户保持登录状态,那么您将不得不尝试一些非基于cookie的东西,而目前,我不确定它会是什么样子。

答案 2 :(得分:0)

如果您未强制newSession或用户未删除Cookie,则该用户仍应登录。

可能是您的浏览器设置为在关闭时删除Cookie,或者您正遭受外部副作用。但是我可以在关闭浏览器后确认cookie在我的开发环境(Chrome和Firefox)中持续存在。

答案 3 :(得分:0)

我试过这个,它对我有用。它基本上是一个组合的动作。


def RememberAction(f: Request[AnyContent] => Result): Action[AnyContent] = {
  Action { request =>
    if(!request.session.get("email").isDefined && request.cookies.get("remember-email").isDefined) {
      f(request).asInstanceOf[PlainResult].withSession("email" -> request.cookies.get("remember-email").get.value)
    } else {
      f(request)
    }
  }
}

然后你可以在控制器中使用这个Action,如下所示:


    def index = RememberAction { implicit request =>
      Ok("Hello World!")
    }