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

5 java cookies session remember-me playframework

我在Play的第一个网站上工作!框架,有时我在用户登录时调用此方法:

static void connect(User user){
    session.put("userid", user.id);
}
Run Code Online (Sandbox Code Playgroud)

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

response.setCookie("user", userdata, "14d");
Run Code Online (Sandbox Code Playgroud)

所以我想知道,创建一个会话有什么意义,当它做同样的事情时?(但不会让我对cookie时间有任何控制权).而我还没有发现的另一件事是如何从请求中读取cookie?

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

soj*_*jin 3

1) 比赛正在进行中!始终通过 cookie 维护(即在客户端),这归因于“不共享”方法。

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

IE。如果用户不选择“记住”,他们的会话只会持续到浏览器关闭为止。

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

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

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