session cookie 在用户登录中的使用
cookie的机制:
Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站跟踪用户,实现用户自定义功能。
Cookie的Domain和Path属性标识了这个Cookie是哪个网站发送给浏览器的;Cookie的Expire属性标识了Cookie的有效时间(如果不设置过期时间,则表示这个Cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。即会话cookie,会话cookie保存在内存里;设置了expire的cookie保存在硬盘上,保存在硬盘上的cookie可以在不同的浏览器进程间共享)。
session的机制:
session是存放在服务器端的类似于HashTable结构。
当浏览器第一次发送请求时,服务器自动生成一个hashtable和一个sessionID,然后通过响应发送到浏览器。
当浏览器第二次发送请求时,会将sessionID放在请求中一并发送到服务器上,取出sessionID,找到hashtable 对比。
session的客户端实现形式(即sessionID在客户端的保存方法):
方法一:使用cookie来保存(“记住我的登录状态”功能就是这么实现的)
服务器通过设置Cookie的方式将Session ID发送到浏览器。如果我们不设置这个过期时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候, Cookie就消失了,这个Session ID就丢失了。如果我们设置这个时间为若干天之后,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同 样会发送到服务器上。
方法二(不常用):使用URL附加信息的方式,也就是像我们经常看到JSP网站会有aaa.jsp?JSESSIONID=*一样的。这种方式和第一种方式里面不设置 Cookie过期时间是一样的。
方法三(不常用):是在页面表单里面增加隐藏域,这种方式实际上和第二种方式一样,只不过前者通过GET方式发送数据,后者使用POST方式发送数据。但是明显后 者比较麻烦。
实现“记住我的登录状态”的功能
其实这已经很好的实现了我们的功能了。但是,前面也提到了,实际上Session并不会一直都存在的,过了一定的时间之后,服务器上的Session就被 销毁了,以减轻服务器的访问压力。当服务器上的数据被销毁后,即使客户端上存放了Cookie也没有办法“记住我的登录状态”了。
通常的实现办法是,将用户的用户名和加密之后的密码也通过cookie的方式存放在客户端,当服务器上的Session销毁以后,使用cookie里面存放的用户名和加密之后的密码重新执行一次登录操作,重建Session,并更新客户端上cookie中存放的sessionID。
多点登录问题怎么解决?
为每个登录的用户分配一个唯一的令牌,比如GUID,客户端的请求必须提供这个令牌,
这样当同一个用户再次登陆时,用户对应的令牌被重写,前一个客户端的令牌失效,自然就被踢了