在大型系统中,单独使用Cookie和Session都是不行的。因为,如:Cookie存储在系统的客户端,则可以很好的解决分布式的访问,但是随着统一域名下的不同服务器,用户每次访问所产生的值存储在Cookie中就会导致Cookie的负荷变重,同时,Cookie也会有大小限制,不超过4KB,还有安全等等问题,所以在分布式访问的情况下不适合用Cookie来进行存储用户的一些关键信息。 分布式session框架的提出就是解决分布式下session存储用户信息的问题。总体框架如下图所示:
增加一个缓存服务器,来有效的资源管理,session存储在这个分布式缓存中,可以随时写入和读取,如:MemCache。对于Cookie,统一配置服务器推送配置可以有效的集中管理资源,所以,可以省去每个应用来配置服务器,如果一个应用新增的一个Cookie,则可以通过一个统一的平台的申请,申请通过将这个配置添加到这个订阅服务器。如果一个应用要使用全局的Cookie,则只需将这个Cookie通过统一推送出去就行了。 关于其存储问题的实现:在应用中web.xml中配置一个SessionFilter,用于请求到达MVC框架之前封装的HttpServletRequest和HttpServletResponse,并创建自己的InnerHttpSession对象,把他设置在request和response对象中,这样的应用系统通过request.getHttpSession()返回的就是我们创建的InnerHttpSession对象,我们可以拦截response的addCookie设置的cookie,其过程如下图所示:
还有另外一个问题就是跨域名共享Cookie问题,要实现session,需要另外一个应用的跳转,,这个应用可以被一个或多个域名访问,它主要就是从一个域名取得sessionID,然后,将这个sessionID同步到另外一个域名下,这个sessionID就是一个Cookie,相当于我们经常遇到的JSESSIONID,具体实现过程如下图:
本文章参考自深入javaweb技术内幕