您的位置:首页 > 其它

Session和Cookie的区别,及多窗口/多服务器下的Session解决方案

2016-05-23 06:18 507 查看
1. Session和Cookie最大的区别是在于Session变量的值是保存在服务器端的(在客户端和服务器端保持状态),Cookie变量的值是保存在客户端的(在客户端保持状态)。
2. 服务器上会保存每一个用户的Session,之间通过Session ID来作为唯一标识符。当客户端与服务器端进行通信请求创建一个新的Session时,服务器端会先检查这个请求里是否已经包含了Session
ID:如果已经包含了,则证明已存在为此用户创建的Session,客户端会将之前的Session检索出来使用;如果不包含,则客户端会创建一个Session及其Session ID,并在此次请求返回时将此Session ID 返回给用户。

3. Cookie 分为 Session Cookie(会话性Cookie) 和 Persistent Cookie(持久性Cookie)。它们的主要区别是:Session
Cookie不包含到期日期,其存储在内存中,不会写入磁盘,当浏览器关闭时,此Cookie将永久删除;Persistent Cookie包含到期日期,其一般存储在磁盘中,在指定的到期日期,Cookie将从磁盘中删除。从安全性上来说,显然Session Cookie的安全性更高。因为它只针对某一次会话存在,当会话结束,Session Cookie就会被删除。Persistent
Cookie 通常是一段存储在本地的加密文本,可能会遭受到Cookie欺骗、跨站脚本攻击等。
4. 浏览器的关闭并不会导致Session失效,重启浏览器是本地操作,并不会影响到服务器的数据(Session)。然而大多数Session
ID 都通过Cookie保存在本地。所以当浏览器重启时,Session Cookie被删除,因此客户端再次向服务器发送请求时就无法找到在服务器上相对应的Session了。由于在服务器上的Session不会被删除,所以服务器上的Session会设置会话失效时间,当上一次使用Session的时间间隔已经超过了此失效时间,服务器就认为客户端已经停止使用此Session,会将Session删除以节省存储空间。
5.  在多窗口的应用中,服务器一般会采取Session Cookie和Persistent
Cookie结合的方式来保证用户端的登陆状态不会失效。在用户新开一个新窗口时,可以先把Session Cookie中的Session ID写入Persistent Cookie中,再通过新窗口读取,并发送通信请求。这样就可以实现跨窗口的Session Tracking(会话追踪)。

6. 在多服务器的应用中,Session的存储(在多服务器间的通用)可以通过以下几个方式解决。

使用独立的缓存器。既将Session的数据存储在一个独立的服务器上。但是这样可能会有一些安全隐患,因此我们可以通过使用memcached分布式缓存服务器来进行存储。
服务器之间的Session不断传递和复制(Tomcat容器的采用方案)。但这种方法有一种弊端,经人测试,web应用所能承载的并发数并没有因为服务器的增加而线性增加,甚至到达一个临界值时,新增服务器甚至会导致并发数的下降。原因是因为不同服务器间Session的传递和复制也会消耗系统资源,当服务器越多/用户请求越频繁,系统资源的消耗也会越来越大。
Session Cookie直接存储到Persistent Cookie中(早期淘宝采用的方案)。但是这种方式不安全,容易遭受恶意截取Cookie等攻击。
Load Balancer - 负载均衡器(硬件:F5;软件:LVS)。负载均衡器可以分发请求,将用户请求均匀地发送到后台服务器。它还有一个特点,它可以记录每个Session
ID对应的服务器。当带有Session ID的请求通过负载均衡器时,它会根据该值直接找到相对应的Web服务器。这种做法的专有名词叫做Sticky Session(Session粘滞)。不过这种做法也有一个弊端,当某个服务器挂掉的时候,其上存储的所有Session都会失效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Session Cookie Web