session简介
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。使用上比Cookie简单一些,相应的也增加了服务器的存储压力。
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。需要注意只有第一次访问JSP、Servlet等程序时才会创建Session,访问HTML、IMAGE等静态资源并不会创建Session。Session生成后,只要用户继续访问,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。服务器就会更新Session的最后访问时间,并维护该Session。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了,默认的过期时间是30分钟。
cookie与session的关系
关系
比较
cookie存储在客户端,session存储在服务器端。也因此:cookie相对来说不如session安全
cookie存储大小和数量有限制,session理论上是无限制的。
cookie的销毁:默认为关闭浏览器,设置过期时间后则过期后就会销毁,
session的销毁:某个请求周期内调用了Session.invalidate()方法,session被销毁;或者是session超时后自动销毁;或者客户端关掉浏览器。
java操作session
HttpSession session = request.getSession();
session.setAttribute("key", value);
session.getAttribute("key");
session.removeAttribute("key");
session.setMaxInactiveInterval(60);//单位为秒
session.invalidate(); //删除所有session中保存的键
集群环境中session共享问题
在讲到解决这些问题之前,我们首先要考虑下session如何存储才是高效,是存在内存、文件还是数据库了?文件和数据库的存储方式都是将session的数据固化到硬盘上,操作硬盘的方式就是IO,IO操作的效率是远远低于操作内存的数据,因此文件和数据库存储方式是不可取的,所以将session数据存储到内存是最佳的选择。因此最好的解决方案就是使用分布式缓存技术,例如:memcached和redis,将session信息的存储独立出来也是解决session同步问题的方法。
Tomcat的session同步也有使用memcache的解决方案,大家可以参加下面的文章:
tomcat集群session同步之memcache方案
但是该方案只是解决了同步问题,session机制任然和web容器紧耦合,我们需要一个高效、可扩展的解决方案,那么我们就应该不是简单的把session独立出来存储而是设计一个完全独立的session机制,它既能给每个web应用提供session的功能又可以实现session同步,下面是一篇用zookeeper实现的分布式session方案:
基于ZooKeeper的分布式Session实现