实现逻辑

把tomcat的session存放在memcached 的集中式缓存中,所有的tomcat共享memcached中的httpsession,能够很好解决tomcat的集群负载,不用使用笨重的session复制,也能轻松解决session数据的同步

把所有的jar文件复制到 tomcat/lib下把context.xml 复制到 tomcat/conf 下,注意修改memcached的连接后台的session是共享的,如果前台的JSESSIONID也是共享的,不就可以实现统一登录了吗? 在同一域名下 例如 test1.abc.com 和 test2.abc.com 浏览器是允许共享cookie的, 只需要把JSESSIONID的作用域设定为 abc.com 就可以了修改 tomcat org.apache.catalina.connector.Request.java protected void configureSessionCookie(Cookie cookie) 这个方法设置cookie作用域为主域名,例如 abc.com

最新的Tomcat7 已经可以自己定义jsessionid的作用域了.不需要再修改 request 了.

1
<Context path="/" docBase="D:\webapp" reloadable="false" sessionCookiePath="/" sessionCookieDomain="abc.com" sessionCookieName="jsessionid"/>

tomcat 6.0.32 和 tomcat6.0.33的Request是不同的我已经处理好了编译好的 class Request.class 类在 tomcat/lib/catalina.jar/org/apache/catalina/connector

统一登录

关于统一登录sso,如果跨域名,可以通过iframe创建不同域名下的jsessionid.跨语言可以通过jsessionid直接从memcached中查找值,找到当前用户的登陆信息,我目前是开了一个服务(jsp页面)让第三方系统调用,因为是在同一个浏览器中打开,可以获取jsessionid作为参数传递,直接从memcached中查找登陆信息.

代码包

tomcat-session.zip