创建会话和cookie之间的区别



我正在用Play开发我的第一个网站!框架,当用户登录时,我会调用这个方法:

static void connect(User user){
    session.put("userid", user.id);
}

只需将userid存储在会话中,我就可以检查是否在每个请求中都设置了它,效果很好。问题是,一旦浏览器关闭,cookie就会丢失,用户需要再次登录。我想创建一个"记住我"选项,似乎唯一的方法就是创建一个cookie并将其与响应一起发送,如下所示:

response.setCookie("user", userdata, "14d");

所以我想知道,创建一个会话有什么意义,当它做完全相同的事情时?(但我无法控制饼干时间)。还有一件事我还没有找到,那就是如何从请求中读取cookie?

(我知道用setCookie创建的cookie没有加密,我需要调用Crypto.sign()

1)正在进行的会话!始终通过cookie(即在客户端)进行维护,这归因于"不共享"方法。

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

即。如果用户不选择被"记住",他们的会话只会持续到浏览器关闭。

3) 真正的区别是,正如您所提到的,session.put()不允许设置会话超时。如果您想延长会话,请将其设置在cookie上。

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

5) 要阅读cookie,request.cookies.get("name")很方便。

在web应用程序中存储状态有两种方法——客户端和服务器端。

在服务器端,您可以使用会话对象或应用程序对象。在客户端,您可以使用查看状态、Cookie、隐藏字段等

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

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

您应该将用户id存储在cookie中,与使用会话属性的位置完全相同。使用HttpServlet请求.getCookies()读取cookie。此方法返回cookie数组,因此您必须对数组进行迭代以识别相关cookie。

要更改cookie,只需覆盖它。

会话允许您将服务器端数据与特定的浏览器会话联系起来:在后台会自动创建一个cookie,服务器使用该cookie来查找与特定浏览器相关的服务器端数据。

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

编辑:这是getCookies文档,用于播放!框架参见http://groups.google.com/group/play-framework/msg/6e40b07ff9b49a8a例如持久登录和cookie检索。

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

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

MSDN提供了一些关于如何在http://msdn.microsoft.com/en-us/library/ms178194.aspx

最新更新