在两个war文件之间共享会话数据



我有两个war文件,如war1和war2

如果我登录应用程序,会话将在war1中创建,如果我导航到war2,我需要相同的会话数据。

我在服务器的context.xml中尝试了crossContext=true,这样我就可以通过将数据存储在servletContext中来访问数据。但问题是,一旦我在chrome中登录屏幕,会话数据将存储在servletContext中,数据将一直保存到应用程序运行为止。

如果我在另一个浏览器(如IE)中也给出了相同的URL,我可以获得servletContext数据,这样就不会导航到登录页面,而是会打开相应的屏幕

请建议我如何在java中克服这个问题?

有什么方法可以在java中找到浏览器切换或浏览器的隐姓埋名窗口模式吗?注意:我使用tomcat服务器

我从未处理过您的确切配置问题,但即使您可以在单个Tomcat实例上实现这一点,如果您的两个web应用程序分布在多个Tomcat实例中,您也可能会遇到问题。

因此,我建议您实际使用数据库来存储状态,该状态需要以安全可靠的方式在两个应用程序之间传递。请注意,只要有一个逻辑数据库,数据库方法在分布式环境中也可以很好地扩展。

虽然会话复制确实可以在Tomcat中完成(请参阅此处),但我确实建议您通过完全消除会话来避免此类问题。

这种会话复制的方法在15-10年前有点常见,但现在,当我们有很多服务器并行运行以服务用户请求并具有弹性集群时,这种方法还不够好,因为基本上它的扩展性不好。

不过,有很多方法可以实现你想要的:

  1. 使用共享数据库存储会话信息。将一些会话Id添加到响应中,并要求客户端将此Id传递回会话中的所有后续请求中。然后根据此Id执行对数据库的查询,并检索所有会话信息。这个解决方案也不能很好地扩展,但如果数据库允许,您可以对会话信息进行分片
  2. 使用Redis/Aerospike保存当前连接用户的会话信息。有点像DB方法,但由于redis是在内存中运行的,所以速度会快得多。通常,这种方法可以与1结合使用,其中redis是内存中的缓存
  3. 加密会话信息,甚至只是加密签名并发送回客户端。客户端将不得不在不知道哪个服务器将实际为该请求提供服务的情况下,将该信息与请求一起提供。在不深入研究密码学的情况下,我只会声明,如果您不希望客户端看到会话信息(尽管事实上这是提供信息的用户),并且签名用于防止篡改数据(同时将数据发送回服务器),则可以进行加密。例如,数据可以通过Header或cookie从客户端提供给服务器

最新更新