在 Tomcat 中的上下文之间共享会话数据

2022-09-01 20:18:13

我一直在寻找在多个战争文件之间共享会话数据的解决方案。我遇到了以下解决方案 http://www.fwd.at/tomcat/sharing-session-data-howto.html

它的基本思想是,如果您有多个 war 文件,则可以使用使用的第一个上下文的 sessionid 设置 cookie。

可以使用将应用于所有上下文/应用程序的路径来设置 Cookie。

例如,如果我对 3 个应用程序进行了以下配置

/myapp/app1
/myapp/app2
/myapp/app3

我可以按如下方式设置饼干

/myapp sessionid.

然后,会话 ID Cookie 将被发送到地址中带有 /myapp 的任何请求。这允许会话 ID 随后由任何上下文使用。

这种方法的唯一问题是它是在2003年编写的,并在Tomcat 4上进行了测试。

你对这种方法有什么看法?有没有更好的方法可以做到这一点?

谢谢


答案 1

那篇文章确实已经过时了。

在 Tomcat 5.5 和 6.0 上,您只需在 的元素中设置属性即可。emptySessionPathtrue<Connector>/conf/server.xml

<Connector ... emptySessionPath="true">

在 Tomcat 7.0 上,这种情况已经发生了变化,因为现在可以从 Servlet 3.0 API 进行配置。然后,在Tomcat的一侧,可以通过在任何负责任的文件中设置in元素来配置它。sessionCookiePath/<Context>context.xml

<Context ... sessionCookiePath="/">

如前所述,有一个新的Servlet 3.0 API,它允许您通过标准API配置会话cookie。您可以通过将以下内容添加到 以下各项来以声明方式执行此操作:web.xml

<session-config>
    <cookie-config>
        <path>/</path>
    </cookie-config>
</session-config>

或以编程方式由 SessionCookieConfig 提供,该配置由 ServletContext#getSessionCookieConfig() 提供

getServletContext().getSessionCookieConfig().setPath("/");

你可以在 ServletContextListener#contextInitialized()HttpServlet#init() 中执行此操作。

另请参阅:


答案 2

据我所知,没有直接的方法可以做到这一点,但是,如果这些上下文共享同一个域,则可以使用域级cookie。

您可以将数据放在cookie中(我不建议这样做)。

或者放置一个安全的会话ID,您可以使用该ID访问某种形式的存储(DB或分布式缓存等)来检索所需的数据。


推荐