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

时间:2019-01-18 10:45:17

标签: java

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

如果要登录该应用程序,则将在war1中创建会话,然后从该位置导航到war2,那么我需要相同的会话数据。

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

如果也在另一个类似IE的浏览器中提供相同的URL,我可以获取servletContext数据,因此无需导航到登录页面,而是可以打开相应的屏幕

请建议我如何克服Java中的这个问题?

有什么方法可以找出Java中浏览器的切换方式或浏览器的隐身窗口模式吗? 注意:我正在使用tomcat服务器

2 个答案:

答案 0 :(得分:1)

我从未处理过您的确切配置问题,但是即使您可以在单个Tomcat实例上完成此工作,但是如果您的两个Web应用程序曾经分布在多个Tomcat实例上,则可能会遇到问题。

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

答案 1 :(得分:0)

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

此会话复制是一种在15到10年之前很普遍的方法,但是如今,当我们有许多并行运行的服务器来满足用户请求并具有弹性集群时,这种方法还不够好,因为基本上伸缩性不好。

但是,有很多方法可以实现您想要的:

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