创建会话和cookie之间的区别?

我在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()

1)一场比赛! 始终通过cookie维护(即在客户端),这归因于“无分享”方法。

2)如果你使用安全模块(或者你可以查看代码,如果你自己编写则遵循),’authenticate()’方法采用参数’remember’并将会话设置为30天( response.setCookie("rememberme", Crypto.sign(username) + "-" + username, "30d");

即。 如果用户没有选择“记住”,他们的会话将持续到浏览器关闭为止。

3)真正的区别在于,正如您所提到的,session.put()不允许设置会话超时。 如果要扩展会话,请在cookie上设置它。

4)如果你想在用户执行CRUD时进行额外的身份validation,(即使用户选择“记住”或者他们的会话已被你明确扩展),最好将用户名/ id设置为缓存(而不是再次将另一个标识符设置为session) )并在用户注销时将其清除。 如果您选择使用像memcache这样的分布式缓存,这将很好地扩展。

5)要从cookie中读取, request.cookies.get("name")会很方便。

有两种方法可以在Web应用程序中存储状态 – 客户端和服务器端。

在服务器端,您可以使用Session或Application对象。 在客户端,您可以使用视图状态,Cookie,隐藏字段等。

会话具有超时持续时间,之后它将过期。 当您访问Web应用程序时,会为您创建一个持续一段时间的会话。 因此,这是每用户的事情。 即使您增加超时持续时间,如果您关闭浏览器,它仍然会过期。 应用程序对象在所有用户之间共享。

Cookie是存储此类信息的更好方式,需要记住这些信息的时间较长,例如一天或更长时间。 你会注意到谷歌允许你保持登录数天。 那是因为他们使用cookie进行状态管理而不是会话。

您应该将用户ID存储在cookie中,与您使用session属性完全相同。 使用HttpServletRequest.getCookies()来读取cookie。 此方法返回cookie数组,因此您必须遍历数组以识别相关的cookie。

要更改cookie,只需覆盖它即可。

该会话允许您将服务器端数据绑定到特定的浏览器会话:在引擎盖下自动创建一个cookie,服务器使用该cookie来查找与特定浏览器关联的服务器端数据。

对会话cookie到期的控制通常在框架的配置中进行(或者有时在应用服务器使用的web.xml文件中)。 您可以从HttpServletRequestgetCookies方法中读取cookie。

编辑: 这是getCookies文档,对于Play! 有关持久登录和cookie检索的示例,请参阅http://groups.google.com/group/play-framework/msg/6e40b07ff9b49a8a 。

基本上,会话仅在用户与您的应用程序交互的时间段+您指定的会话超时期间可行。 Cookie的可用性是将相关信息存储到用户,以便当他们再次回到网站时,您可以再次识别它们。

例如,如果您同时拥有关于用户的敏感和不敏感信息,则可以通过cookie确定他们的身份并加载所有不敏感信息,从而使您的应用程序更加友好。 一旦他们对自己进行身份validation,您也可以加载敏感信息。

有关如何使用cookie的MSDN有一些很好的参考资料,请访问http://msdn.microsoft.com/en-us/library/ms178194.aspx