在2个子域之间共享会话数据

时间:2011-01-27 00:45:54

标签: java session tomcat servlets

我正在使用tomcat 7.0.6和jdk 1.6.0_22

是否可以使用公共子域(例如a.mydomain.com和b.mydomain.com)在2个不同的域之间共享会话数据?

使用默认的java servlet a.mydomain.com和b.mydomain.com会获得不同的会话,但是无法为mydomain.com中的所有子域创建共享会话吗?

问题还在于我没有直接控制commen子域名(mydomain.com)所以我无法从mydomain.com提供任何servlet

3 个答案:

答案 0 :(得分:14)

将相关网络应用的sessionCookieDomain元素的<Context>属性设置为.mydomain.com(注意前导点,这非常重要)。这将允许webbrowser在所有子域之间共享cookie。

如果您实际上有多个webapp上下文,并且您想要在它们之间共享会话,那么您还需要将所讨论的webapps的sessionCookiePath元素的<Context>属性设置为{{1 }}

简而言之:

/

另见:


对于Tomcat 6用户:请注意,这是在Tomcat 6.0.27中引入的。对于无法升级的用户,您需要<Context sessionCookieDomain=".mydomain.com" sessionCookiePath="/"> 来修改Cookie域,最终与ValveemptySessionPath元素中的<Connector>属性结合使用你有多个你想要分享会话的webapp上下文。

答案 1 :(得分:3)

Servlet Spec 3.0(这是Tomcat 7支持的)通过在SessionCookieConfig上调用setDomain来实现这一点。

详细信息: http://download.oracle.com/javaee/6/api/javax/servlet/SessionCookieConfig.html

使用ServletContextListner在webapp初始时以编程方式获得SessionCookieConfig - 或者您应该能够在web.xml中将其设置为值。

答案 2 :(得分:0)

您可以使用Cookie创建自己的会话实施。使用cookie和服务器端数据库或文件处理会话(在大多数服务器端语言中)。您创建一个令牌(在时间戳上使用md5)并将其与所有会话变量一起保存在文件或数据库中。