我在Play的第一个网站上工作!框架,有时我在用户登录时调用此方法:
static void connect(User user){
session.put("userid", user.id);
}
只需将用户ID存储在会话中,我就可以检查它是否在每个请求中设置,工作正常。问题是,一旦浏览器关闭,cookie就会丢失,用户需要再次登录。我想创建一个“记住我”选项,似乎唯一的方法是创建一个cookie并将其与响应一起发送,如下所示:
response.setCookie("user", userdata, "14d");
所以我想知道,创建一个会话有什么意义,当它做同样的事情时? (但不会让我对cookie时间有任何控制权)。还有一件我还没有找到的,就是如何从请求中读取cookie?
(而且我知道使用setCookie创建的cookie未加密,我需要调用Crypto.sign()
)
答案 0 :(得分:3)
1)参加比赛!始终通过cookie维护(即在客户端),这归因于“无分享”方法。
2)如果你使用安全模块(或者你可以查看代码,如果你自己编写则遵循),'authenticate()'方法采用参数'remember'并将会话设置为30天(response.setCookie("rememberme", Crypto.sign(username) + "-" + username, "30d");
)
即。如果用户不选择“记住”,他们的会话将持续到浏览器关闭为止。
3)真正的区别在于,正如您所提到的,session.put()不允许设置会话超时。如果你想扩展会话,那么在cookie上设置它。
4)如果您想在用户执行CRUD时进行额外的身份验证(即使用户选择“记住”或他们的会话已被您明确扩展),最好将用户名/ ID设置为缓存(而不是设置另一个标识符)再次进行会话)并在用户注销时将其清除。如果您选择使用像memcache这样的分布式缓存,这将很好地扩展。
5)要从cookie中读取,request.cookies.get("name")
会很方便。
答案 1 :(得分:1)
有两种方法可以在Web应用程序中存储状态 - 客户端和服务器端。
在服务器端,您可以使用Session或Application对象。 在客户端,您可以使用“查看状态”,“Cookie”,“隐藏字段”等
会话具有超时持续时间,之后它将过期。当您访问Web应用程序时,会为您创建一个持续一段时间的会话。因此,它是每用户的事情。即使您增加超时持续时间,如果您关闭浏览器,它仍然会过期。应用程序对象在所有用户之间共享。
Cookie是存储此类信息的更好方式,需要长时间记住这些信息,例如:一天或更长时间。你会注意到谷歌允许你保持登录数天。那是因为他们使用cookie进行状态管理,而不是会话。
答案 2 :(得分:0)
您应该将用户ID存储在cookie中,与您使用session属性完全相同。使用HttpServletRequest.getCookies()来读取cookie。此方法返回cookie数组,因此您必须遍历数组以识别相关的cookie。
要更改Cookie,只需覆盖它即可。
答案 3 :(得分:0)
该会话允许您将服务器端数据绑定到特定的浏览器会话:在引擎盖下自动创建一个cookie,服务器使用该cookie来查找与特定浏览器关联的服务器端数据。
对会话cookie到期的控制通常在框架的配置中(或者有时在应用服务器使用的web.xml文件中)完成。您可以使用HttpServletRequest
的{{1}}方法阅读Cookie。
编辑:this是getCookies
文档,适用于Play!框架请参阅http://groups.google.com/group/play-framework/msg/6e40b07ff9b49a8a以获取持久登录和cookie检索的示例。
答案 4 :(得分:0)
基本上,会话仅在用户与您的应用程序交互的时间段+您指定的会话超时时间内可行。 Cookie的可用性是将相关信息存储给用户,以便当他们再次回到网站时,您可以再次识别它们。
例如,如果您同时拥有关于用户的敏感和不敏感信息,则可以通过cookie确定他们的身份并加载所有不敏感信息,从而使您的应用程序更加友好。一旦他们对自己进行身份验证,您也可以加载敏感信息。
MSDN有一些很好的参考资料,介绍如何在http://msdn.microsoft.com/en-us/library/ms178194.aspx
处理Cookie