【问题标题】:Store cookie even if the session is closed即使会话关闭也存储 cookie
【发布时间】:2012-04-30 01:40:09
【问题描述】:

什么是 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

【问题讨论】:

  • 您在每次请求时从会话中检索它。请看一下 zentasks 示例,它展示了如何执行所有这些操作。
  • 我看过 Zentasks,但是当浏览器关闭时,zentasks 会话不会持续存在。我想记住用户,当他第二天访问时,自动将他登录到应用程序中。或者我错过了什么?
  • 这必须是您的浏览器中的设置,因为通常cookie不会被删除。

标签: session-cookies playframework-2.0


【解决方案1】:

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

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

【讨论】:

  • 您如何创建 PLAY_SESSION cookie?因为这个 cookie(包含我的用户 ID 对一个会话有效 :-(
  • @adis,Play 会自动创建,您无需为此做任何事情
  • @PereVillega 不正确,请关闭您的网络浏览器并观看您的会话再见(chrome cookie 管理器“过期:当我关闭浏览器时”)。当然,这也会在 cookie 场景中使用有用的 store-user-email 来避免强迫用户一遍又一遍地重新输入他们的登录电子邮件。不是每个人都让他们的机器进入睡眠状态并让他们的浏览器保持打开状态。那些不写愤怒的技术支持票的人。
  • @virtualeyes 这就是我所说的,如果用户不删除它们:) 默认情况下在 Firefox 中(不更改配置)不会发生。如果用户更改配置...
  • @PereVillega 对,好吧,Firefox 并不是万能的——IE、Chrome、Safari、Opera 等可能有自己的关于 cookie 在浏览器关闭时过期的政策。许多用户对新站点不满意(它的外观和性能都非常好),因为可用性受到了打击(在 LAMP 堆栈之前,我只是设置了一个长期过期的 cookie 并完成了它)。必须找到解决方法,对于重启和/或关闭浏览器的用户来说,目前情况不是很好
【解决方案2】:

引用Play 2.0 Session Documentation:

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

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

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

【讨论】:

    【解决方案3】:

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

    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 { 隐式请求 => 好的(“你好世界!”) }

    【讨论】:

      【解决方案4】:

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

      例如:

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

      【讨论】:

      • +1,有趣的是,如果我们可以在每个 cookie 的基础上设置它会很好。例如,我想设置一个长期过期的用户电子邮件 cookie,但在其他情况下保留默认值。设置一个为期 4 周的购物车会话可能有点多。
      • @virtualeyes Threadless 让我的购物车相隔数月,我喜欢它。
      • +1 到 session.maxAge - 请注意 7d、1h 无效。
      • 我正在使用Play 2.3.10,设置单位为毫秒(我刚刚测试过)。
      猜你喜欢
      • 2016-05-20
      • 1970-01-01
      • 2014-11-30
      • 2015-10-18
      • 2020-12-26
      • 2011-04-10
      • 2017-08-03
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多