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

时间:2012-02-24 19:21:57

标签: java jsp session tomcat servlets

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

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

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

例如,如果我有3个应用程序的以下配置

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

我可以按如下方式设置cookie

/ myapp sessionid。

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

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

您对此方法有何看法?有没有更好的方法呢?

由于

4 个答案:

答案 0 :(得分:42)

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

在Tomcat 5.5和6.0上,您只需在emptySessionPath的{​​{1}}元素中将true属性设置为<Connector>

/conf/server.xml

在Tomcat 7.0上,这已经改变,因为现在可以从Servlet 3.0 API上配置它。然后,可以通过在任何负责的<Connector ... emptySessionPath="true"> 文件中的sessionCookiePath元素中将/设置为<Context>来配置Tomcat。

context.xml

如上所述,有一个新的Servlet 3.0 API,允许您通过标准API配置会话cookie。您可以通过向<Context ... sessionCookiePath="/"> 添加以下内容以声明方式执行此操作:

web.xml

SessionCookieConfigServletContext#getSessionCookieConfig()编程方式。

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

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

另见:

答案 1 :(得分:2)

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

您可以将数据放入cookie中(我不推荐)。

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

答案 2 :(得分:1)

如果数据量不是天文数据且数据本身变化不太快,您可能需要考虑使用JNDI。此解决方案的设计完全符合您的要求。

您可以查看official documentationthis post to tomcat-user mailing list以获取参考资料&amp;实例

答案 3 :(得分:0)

对于Tomcat 8,我使用以下配置在2个Web应用程序之间共享会话:

conf / context.xml

<Context sessionCookiePath="/">

    <Valve className="org.apache.catalina.valves.PersistentValve"/>
    <Manager className="org.apache.catalina.session.PersistentManager">
        <Store className="org.apache.catalina.session.FileStore" directory="${catalina.base}/temp/sessions"/>
    </Manager>

    ...

</Context>

我两次部署相同的简单Web应用程序 log.war log2.war

/log
/log2

我现在可以登录/log并在/log2中显示用户,这不适用于tomcat的默认配置。

enter image description here

已设置会话值并读取:

HttpSession session=request.getSession();  
session.setAttribute("name",name);

HttpSession session=request.getSession(false);  
String name=(String)session.getAttribute("name");  

我以这个项目为例:https://www.javatpoint.com/servlet-http-session-login-and-logout-example

大多数示例/解决方案使用内存数据库,这需要更多的设置工作: