【问题标题】:Sharing session data between two war files在两个war文件之间共享会话数据
【发布时间】:2019-01-18 10:45:16
【问题描述】:

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

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

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

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

请建议我如何在 java 中解决这个问题?

有没有办法在java中找出浏览器的浏览器切换或隐身窗口模式? 注意:我使用的是tomcat服务器

【问题讨论】:

    标签: java


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      这种会话复制是一种在大约 15 到 10 年前有点普遍的方法,但是现在当我们有很多并行运行的服务器来服务用户请求并拥有弹性集群时,这种方法还不够好,因为基本上它不能很好地扩展。

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

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

      【讨论】:

      • 你能用一些参考资料详细解释你的第三个选项吗?
      • 以 JWT 令牌为例。有关用户的信息在此令牌中。
      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2011-06-16
      • 2010-12-01
      • 2020-02-29
      相关资源
      最近更新 更多