Java 在Tomcat中在上下文之间共享会话数据
我一直在寻找在多个war文件之间共享会话数据的解决方案。我遇到了以下解决方案 它的基本思想是,如果您有多个war文件,您可以使用使用的第一个上下文的sessionid设置cookie 可以使用将应用于所有上下文/应用程序的路径设置cookie 例如,如果我有以下3个应用程序的配置Java 在Tomcat中在上下文之间共享会话数据,java,jsp,session,tomcat,servlets,Java,Jsp,Session,Tomcat,Servlets,我一直在寻找在多个war文件之间共享会话数据的解决方案。我遇到了以下解决方案 它的基本思想是,如果您有多个war文件,您可以使用使用的第一个上下文的sessionid设置cookie 可以使用将应用于所有上下文/应用程序的路径设置cookie 例如,如果我有以下3个应用程序的配置 /myapp/app1 /myapp/app2 /myapp/app3 我可以如下设置一个cookie /myapp会话ID 然后,sessionid cookie将发送到地址中带有/myapp的任何请求。这允许会话
/myapp/app1
/myapp/app2
/myapp/app3
我可以如下设置一个cookie
/myapp会话ID
然后,sessionid cookie将发送到地址中带有/myapp的任何请求。这允许会话id随后被任何上下文使用
这种方法唯一的问题是它是在2003年编写的,并在Tomcat4上进行了测试
你对这种方法有什么看法?有更好的方法吗
谢谢据我所知,没有直接的方法可以做到这一点,但是如果这些上下文共享同一个域,您可以使用域级cookie 您可以将数据放入cookie(我不建议这样做)
或放置一个安全会话ID,您可以使用它访问某种形式的存储(DB或分布式缓存等)来检索所需的数据。
< P>如果数据量不是天文数据,并且数据本身没有太快变化,那么您可能需要考虑使用JNDI。此解决方案正是为您所寻找的内容而设计的您可以查看或查找参考资料和示例。那篇文章确实严重过时 在Tomcat5.5和6.0上,您只需在
/conf/server.xml
中的
元素中将emptySessionPath
属性设置为true
在Tomcat7.0上,这一点已经改变,因为现在可以从上的Servlet3.0API进行配置。然后,在Tomcat端,可以通过在任何负责的context.xml
文件的
元素中将sessionokiepath设置为
来配置它
如上所述,有一个新的Servlet3.0API,允许您通过标准API配置会话cookie。您可以通过将以下内容添加到web.xml
,以声明方式执行此操作:
/
或以编程方式,通过它可以使用
你可以在家里做这件事
另见:
- -提到潜在的安全漏洞
对于Tomcat 8,我使用以下配置在两个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>
我现在可以登录到/log
,并将用户显示在/log2
中,这不适用于tomcat默认配置
设置并读取会话值:
HttpSession session=request.getSession();
session.setAttribute("name",name);
HttpSession session=request.getSession(false);
String name=(String)session.getAttribute("name");
我以这个项目为例:
大多数示例/解决方案使用内存中数据库,这需要更多的设置工作:
我忘了提到,上下文都在同一个Tomcat实例中运行。我认为这没有什么区别,但我可能错了。我猜另一个选项是将cookie路径设置为“/”,这就是我将其设置为域的意思。我认为这是唯一的选择。你能给我举个例子说明如何做到这一点吗。谢谢这是非常有用的信息。我不太明白其中的大部分是如何工作的,但至少它给了我一个进一步调查的方向。有没有关于如何使用这些的例子?我使用的是Tomcat 6.0,/conf/server.xml
位于Tomcat的安装文件夹中。只需在文本/XML编辑器中打开XML文件,找到用于为您的Web应用提供服务的
元素,并将emptySessionPath=“true”
属性添加到该元素。如果我将emptySessionPath设置为true,所有应用程序是否都获得相同的jsessionid,还是仍然获得不同的jsessionid?感谢在web.xml
上设置cookie路径也适用于Glassfish,在Tomcat 9()中,似乎忽略了web.xml
中的元素。重要的是在tomcat范围的context.xml
(在/conf
中)或META-INF
中特定于战争的context.xml
中的属性sessionokiepath
的值。您能否澄清您的答案,是需要设置context.xml
还是需要设置web.xml
,以及优先级是什么?根据我的经验,只使用了context.xml
。这里也没有提到web.xml
:
/log
/log2
HttpSession session=request.getSession();
session.setAttribute("name",name);
HttpSession session=request.getSession(false);
String name=(String)session.getAttribute("name");