j2ee中session的一些概括

Share

   很久没有这么沉下心想技术方面的这些东西了,特别是java方面的,整理+证实弄了将近3个小时。

   说到session,首先不得不提到的是sessionid(有app容器通过特殊的算法生成的唯一标识),它是服务器端用来唯一标识一个客户端的key。通常来说可以理解成是一个浏览对象,直到这个容器关闭之前,所有生成的sessionid都是唯一的。

   app server一般通过3种方式推送这个key,即cookie、URL重写、和隐藏表单,后两种是类似的。如果是第一种,那么Sessionid被关联到一个浏览器实例周期的cookie里(即浏览器关闭,cookie就会失效),然后客户端浏览器每次用这个cookie来标示会话。通常这些都是Web容器替我们完成的。如果是URL重写,则每个请求字符串后面会被附加如jsessionid=1A076E73EA31EDD3E735F34256C245B8 这样的标识用来标识会话,当浏览器被设置成拒绝cookie的时候,一般都是采用第二种方式。

关于服务器的集群(以tomcat为例)

   一个tomcat实例,能承受的上限是500client同时做op,如果超过这个限制的应用,为了不引起麻烦,一般都采取了集群的方法。这样就涉及到各个tomcat实例之间共享session的问题,而且很多的厂商或者开源的解决方案也做得不错了,例如:oscache,memcached,Tangosol Coherence等等,可以自动的管理所有的session,但是,使用这些的时候,就要注意session的update了,由于全部是在mem里面进行的,你机器的mem也需要足够大:)
   但是对于我们,简单来说,一个appserver的session都保存在一个hashmap里面,而且是线程安全的。有人也就会说,能不能将其钝化之后,做硬件设备上的保存,通过IO来共享,就像php一样的。怎么说呢,首先apache jakata没有留这个方面的扩展,就是不想将一个本来简单的事情,做的那么复杂,还不如专门做商业软件了,起码可以直接盈利。如果你够牛,得,你也可以修改tomcat的代码,未尝不可,这样也有要注意的地方,所有放在session里面的对象都要进行序列化,同时需要修改的至少有HttpSessionWrapper.java,MemcachedSnaHttpSessionWrapper.java,MemcachedSnaHttpServletRequestWrapper.java,MemcachedSnaFilter.java 这些类。当然,也有一些人把session持久后保存到数据库,不过本人觉得,还是看自己的需求来吧。

   前后不接的写了这么多,凑合吧。。该喝口茶了。