Cookie与Session是网络上进行会话保持或身份跟踪的两种机制,理解这两种方式的区别对我们提高网站运行的效率与安全十分重要。
网站利用这两种技术,来知道我们的登录保持状态。比如说,当jack第一次登录网站时,发送信息给服务器,服务器会在内存中开辟出来一块区域用来存放标识jack的Session,并将此Seesion以JSESSIONID=jack的方式传回给浏览器,浏览器需要将此数据保存在本地,使用键值对(key:JSESSIONID,value:jack)的方式进行存储,这种方式就是Cookie。当jack再次点击网站上的内容时,浏览器将此Cookie传给服务器,服务器才能知道此次操作是jack的行为,故不需要让jack进行再次登录。
(1)Cookie的数据保存在客户端。
(2)Cookie中只能存放少量的数据,数据大小和数量方面都有限制。
(3)Cookie机制不是很安全,我们可以分析存放在本地的Cookie从而进行Cookie欺骗。因此,Cookie中最好不存放一些敏感的信息。
(4)Cookie的过期时间:如果不设置Cookie的过期时间,则将当前Cookie称为会话Cookie,表示这个Cookie的生命期为浏览器的会话期间,关闭浏览器窗口,Cookie就消失了,会话Cookie一般保存在内存里。设置了过期时间,则将当前Cookie称为持久Cookie,浏览器会把Cookie保存在硬盘上,存储在硬盘上的Cookie会在不同的浏览器进程间共享。
(5)应用场景:
【1】判断注册用户是否已经登录网站:用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录流程。
【2】根据用户的爱好定制内容:网站创建包含用户浏览内容的cookies,在用户下次访问时,网站根据用户的情况对显示的内容进行调整,将用户感兴趣的内容放在前列。
【3】实现永久登录:如果用户是在自己家的电脑上上网,登录时就可以记住他的登录信息,下次访问时不需要再次登录,直接访问即可。
【4】实现自动登录:当用户注册网站后,就会收到一个惟一用户ID的cookie。用户再次连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否是注册用户且选择了自动登录,从而使用户无需给出明确的用户名和密码,就可以访问服务器上的资源。
【5】使用cookie记录各个用户的访问计数:获取cookie数组中专门用于统计用户访问次数的cookie的值,将值加1并将最新cookie输出。
【6】使用cookie记住用户名与用户密码。用户勾选了“自动登录”,就把用户名和密码的信息放到cookie中。同时可设置有效期。
【7】用cookie实现新手大礼包等弹窗功能。同理,将新手大礼包弹窗逻辑写入到cookie中,并设置相应的有效期。比如在有效期内只弹出一次该弹窗,超过有效期登录后再次弹出弹窗。
(1)Session的数据保存在服务器端,准确的来说是保存在服务器端的内存中,当服务器重启后,Session就会消失。
(2)Session没有大小的限制,Session保存的数据由服务器的内存决定,内存越大,保存的Session就越多。
(3)但我们过量的使用Session时,会占据大量内存,大大降低服务器的性能。为了防止Session过多造成的内存溢出,我们会对Session设置超时时间,如果在这个时间内,用户没有继续访问过网站,服务器就会在内存中将这个Session剔除掉。
(4)应用场景:
【1】通过session累计用户数据。例如,一个未登录用户访问了京东网站,这个时候京东对其下发了一个 cookie,假设cookie的名字叫做abc,那这条记录就是 abc=001,同时京东的后台也生成了一个 session id, 它的值也为 001, 001 这个客户在 2 点、 3 点、 4 点分别添加了三件商品到购物车,这样后台也记录了 session id 为 001的用户的购物车里面已经有三件商品,并且只要每次客户端 cookie 带上来的值里面包含session id,后台都能够展示相应的数据,如果这个时候,在浏览器里面清空 cookie,cookie 数据消失之后,后台和客户端无法建立对应关系,购物车的数据就会失效了。
【2】通过session实现单点登录。一个用户帐号成功登录后,在该次session还未失效之前,不能在其他机器上登录同一个帐号。登录后将用户信息保存到session中,如果此时在另外一台机器上一个相同的帐号请求登录,通过遍历(遍历的意思就是将所有session都查看一遍)Web服务器中所有session并判断其中是否包含同样的用户信息,如果有,在另一台机器上是不能登录该帐号的。
当用户决定禁用Cookie,而我们除了强制让用户开启Cookie外,还有什么其他方法来让我们进行会话保持呢。
直接把JSESSION=ID附在请求链接的后面,而不是存放在HTTP的请求头中。
服务器根据登录名自动修改表单中某个隐藏字段的值,也就是不同的人请求相同的网页,返回的网页都不是相同的。例如:
两中方式的本质其实是一样的,不从请求头中的Cookie字段获取,而是从请求内容中获取。
好了,以上就是我对Cookie与Session的总结,大家也应该都明白了吧。