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
答案 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!") }