Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Tomcat中在上下文之间共享会话数据_Java_Jsp_Session_Tomcat_Servlets - Fatal编程技术网

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

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的任何请求。这允许会话

我一直在寻找在多个war文件之间共享会话数据的解决方案。我遇到了以下解决方案

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

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

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

/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");