不使用容器session 如何自行实现session

因为种种原因 不能使用容器的session
必须自行实现 并且要支持分布式 各个node之间的session自行同步

请问各位大虾 有何方案

[quote]
如果Memcached达到内存使用上线,这个时候创建session会如何?
应该如何控制?
[/quote]
memcache是可以进行集群的嘛,而且由memcache客户端控制访问集群中的节点。这也是为什么许多互联网公司使用它的一个原因,伸缩性好。有了水平伸缩,内存不是问题,比如像facebook也大量使用memcache的。

这个好像不行吧?session是寄托容器存在的。

[quote]
因为种种原因 不能使用容器的session
必须自行实现 并且要支持分布式 各个node之间的session自行同步
[/quote]
你是指不能使用session基于容器的的存储方式呢,还是所容器实现的session完全不能用?

利用memcached实现分布式session存储,如果想沿用tomcat的session api需要修改Tomcat源码,将StandardManager的父类ManagerBase的ConcurrentHashMap替换掉。。也可以自己实现一套api后调用,总之session需要独立存储。

如果使用struts2框架;就可以通过ioc反转方式;实现SessionAware接口;从写里面的setSession就可以得到session封装的hashMap。

[quote]容器实现的session完全不能用 [/quote]大
session大致的意思就是为客户端保存一些数据,然后每个客户端通过令牌来查找。如果要自己实现一个的话,大致可以这么做:
1、为每个请求(你需要有session的请求)产生一个全局唯一的标识,如UUID,作用类似于(jsessionid)。
2、把sessionid发送到客户端,请求时提交到服务器获取数据。这个和现有容器session实现类似,利用cookie或url重写。
2、session数据的存储方式由你的代码实现。存储方案有很多,简单的比如直接保存至文件系统,需要分布式可以采用分布式文件系统。这两种方案,我觉得不是很好,一方面这样保存的数据读写比较慢,另一方面,session数据并不是需要永久持久化的。所以,我倾向于使用内存存储方式,2比如memcache,nosql(redis),这样在性能和分布式方面都没有问题。无论哪种方式,你都需要负责对象的序列化,当然有一些工具可以用,比如memcache和redis的java客户端。

以上是个人的一点想法,未经实践过,作者参考一下。
另外,我想问一下作者,你是什么使用场景,导致你不能使用容器提供的session呢?