最近回顾了一下Session,权且总结一下:
什么是Session?
1.本意即是“会话”,是指从一个浏览器窗口打开到关闭这个期间。
2.有时候也仅仅指一次连接。
3.当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义。
4.session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案。
5.有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里”。
6.session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session。
所以“Session”具体指的是什么,还需要根据具体的语境来判断。
为什么要用Session?
1.我们利用互联网上进行各种活动需要用到HTTP协议,但是HTTP协议本身是无状态的,也就是每个HTTP请求之间相互独立,互不记录其行为。
2.但是这种HTTP协议对人们来说是有缺陷的,人们有时候需要让某些请求之间有联系,比如说在购物网站,需要记住每个人的连续的操作,于是就出现了Cookie,Cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力,但是Cookie是存储于客户端的,很容易被获取和篡改,这样很不安全。
3.于是就出现了存储于服务器端的Session,来解决这个问题,Session允许通过将数据存储在HTTP服务器中,用以在整个会话过程中保持该数据。所以Session不仅是一个时间概念,还包括特定的用户和服务器数据。
Session的创建和销毁
1.在程序中第一次调用request.getSession()方法时就会创建一个新的Session,可以用isNew()方法来判断Session是不是新创建的。
2.session在下列情况下被删除:
a.程序调用HttpSession.invalidate();
b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置,session对象默认超时设置为30分钟,web.xml文件中可以手工配置session的失效时间 。
c.服务器进程被停止(非持久session)
Session的共享
上文铺垫了这么多,下文是重点,很显然我们现在常常需要在多台服务器上实现Session的共享,那么该如何去做呢?
一般有这三种方式:
1.找一块公共的空间用来储存session,而不是将session储存在集群节点的某台服务器上,此时,每一台服务器都能访问这块空间,从而实现session共享;
2.仍在每台服务器上保存session信息,不作修改,但采用另一种同步机制,实时同步每一台服务器的session信息;
3.构建一种全新的鉴权机制,不采用session-cookie机制,但要去除此鉴权机制对单个服务器的依赖。
Session共享具体应用举例
1.持久化session到数据库,即使用数据库来储存session。数据库正好是我们普遍使用的公共储存空间,一举两得,推荐使用mysql数据库,轻量并且性能良好。
优点:就地取材,符合大多数人的思维,使用简单,不需要太多额外编码工作
缺点:对mysql性能要求较高,访问mysql需要从连接池中获取连接,又因为大部分请求均需要进行登录鉴权,所以操作数据库非常频繁,当用户量达到一定程度之后,极易造成数据库瓶颈,不适用于处理高并发的情况。
2.使用redis共享session。redis是一个key-value的储存系统。可以简单的将其理解为一个数据库,与传统数据库的区别是,它将数据储存于内存中,并自带有内存到硬盘的序列化策略,即按策略将内存中的数据同步到磁盘,避免数据丢失,是目前比较流行的解决方案。
优点:无需增加数据库的压力,因为数据存储于内存中,所以读取非常快,高性能,并能处理多种类型的数据。
缺点:额外增加一些编码,以便操作redis。
3.使用memcache同步session,memcache可以实现分布式,可将服务器中的内存组合起来,形成一个“内存池”,以此充当公共空间,保存session信息。
优点:数据储存在内存中,读取非常快,性能好;
缺点:memcache把内存分成很多种规格的存储块,有大有小,不能完全利用内存,会产生内存碎片,浪费资源,如果储存块不足,还会产生内存溢出。
4.通过脚本或守护进程在多台服务器之间同步session。
优点:实现了session共享;
缺点:对个人来说实现较为复杂,速度不稳定,有延时性,取决于现实中服务运行状态,偶然性较大,如果用于访问过快,可能出现session还没同步成功的情况。
5.使用NFS共享session。NFS是Network File Server共享服务器的简称,最早由Sun公司为解决Unix网络主机间的目录共享而研发。选择一台公共的NFS做共享服务器,储存所有session数据,每台服务器所需的session均从此处获取。
优点:较好的实现了session共享;
缺点:成本较高,对于个人来说难以实现。NFS依托于复杂的安全机制和文件系统,因此并发效率不高。
6.使用Cookie共享session。此方案可以说是独辟蹊径了,将分布式思想用到了极致。session-cookie机制中,session与cookie相互关联,以cookie做中转站,用来找到对应的session,其中session存放在服务器。那么如果将session中的内容存放在cookie中呢,那么则省略了服务器保存session的过程,后台只需要根据cookie中约定的标识进行鉴权校验即可。
优点:完美的贯彻分布式的理念,将每个用户都利用起来,无需耗费额外的服务器资源;
缺点:受http协议头长度限制,cookie中存储的信息不宜过多;为了保持cookie全局有效,所以其一般依赖在根域名下,所以基本上所有的http请求都需要传递cookie中的这些标记信息,所以会占用一些服务器的带宽;鉴权信息全存储于cookie中,cookie存在于客户端,服务器并没有储存相关信息,cookie存在着泄露的可能,或则其他人揣摩出规则后可以进行伪装,其安全性比其他方案差,故需要对cookie中信息进行加密解密,来增强其安全性。