我故意写'会话感知'而不是'会话共享'应用程序。以下是一个场景:
我在一个Tomcat实例中部署了一个webapp(WA1)。假设所有应用程序都部署在root上,我们不处理上下文。该应用程序允许用户登录,在现场进行操作并注销。
另一个tomcat实例上还有另一个webapp(WA2)。这个应用程序处理一个服务,比方说,它会读取一些文件和流到浏览器。
WA1提供的页面有一个链接到WA2的链接。
现在我在WA1中有一个有效的会话,用于识别用户是谁以及会话是否是有效会话。我希望WA2在接受WA1提供的页面请求之前了解它。
处理此问题的最佳方法是什么?
我排除了共享会话(除非这是更好的方法,请解释),因为WA1本身可以负载均衡,WA2可以负载均衡,并保持共享会话超过两个负载平衡的实例该应用程序可能会压倒性的。
我倾向于'令牌'机制..其中WA1创建与每个会话相关联的令牌,并使其可从WA1提供的任何页面的每个URL到WA2。 WA2将首先检查令牌,并查看它是否是有效令牌(许多方法是这样做的:A:向WA1进行Web服务调用以询问令牌是否是有效的会话令牌.B:WA1持续存在于DB或文件系统和WA2从那里寻找..),如果它是有效的,那么尊重请求。这里的问题是确保当WA1中的会话到期时令牌无效。
我想知道这种方法是否足够好,还是有更好的方法来做到这一点?
由于
微米。而
答案 0 :(得分:1)
默认情况下,servlet API使用cookie(通常名为jsessionid
)在每个浏览器中存储会话ID。然后,浏览器会根据每个请求将cookie传递给服务器。只要tomcat的两个实例都在同一个域中,它们都应该可以访问该cookie。除非我遗漏了某些内容,否则只需在第二个应用程序中测试该cookie。
更新:即使tomcat的每个实例都在不同的域中运行,他们仍然可以通过调用Cookie类的setDomain(String domainPattern)
方法来共享这些cookie。