6

什么是 Play 的最佳方法!应用程序记住用户?我认为唯一可能的解决方案是使用客户端cookie,对吗?但是一旦浏览器关闭,这个会话就被破坏了,对下一个请求无效?你是如何/如何解决(d)这个问题的?

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

session("userid", user.id);

然后我使用拦截器来避免在每次需要时传递参数,就像这里描述的那样:如何避免在 play2 中到处传递参数?

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

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

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

4

4 回答 4

5

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

例如:

# Set session maximum age in seconds (4w)
session.maxAge=2419200 
于 2012-11-16T22:51:58.170 回答
1

引用Play 2.0 会话文档

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

出于安全原因,现代浏览器将在退出时使 cookie 无效,这不是您可以更改的,因为它会允许黑客使用他们不正当拥有的凭据来做坏事。

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

于 2012-04-19T13:13:59.847 回答
0

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

def RememberAction(f: Request[AnyContent] => Result): Action[AnyContent] = {
  行动{请求=>
    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)
    } 别的 {
      f(请求)
    }
  }
}

然后你可以像这样在你的控制器中使用这个动作:

    def index = RememberAction { 隐式请求 =>
      好的(“你好世界!”)
    }

于 2012-04-26T18:02:26.910 回答
0

如果您不强制 anewSession或用户不删除 cookie,则用户仍应处于登录状态。

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

于 2012-04-19T11:28:07.033 回答