我故意编写了“会话感知”应用程序,而不是“会话共享”应用程序。以下是一个场景:

我在一个Tomcat实例中部署了一个Webapp(WA1)。假定所有应用程序都部署在root上,并且我们不处理上下文。该应用程序允许用户登录,在网站上执行其操作并注销。

在另一个tomcat实例上还有另一个webapp(WA2)。该应用程序处理一项服务,可以说它读取一些文件并流向浏览器。

WA1提供一个页面,该页面具有一个链接到WA2的链接。

现在我在WA1中有一个有效的会话,该会话可识别用户身份以及该会话是否为有效会话。在履行WA1服务页面的请求之前,我希望WA2知道这一点。

处理此问题的最佳方法是什么?

由于WA1本身可以实现负载平衡,而WA2可以实现负载平衡,因此我已经排除了共享会话(除非是更好的方法,请解释),并且可以在应用程序的两个负载平衡的实例上保持共享会话变得势不可挡。

我倾向于一种“令牌”机制。WA1在其中创建与每个会话相关联的令牌,并使其可用于WA1提供的任何页面中指向WA2的每个URL。 WA2首先会检查令牌,然后查看它是否为有效令牌(许多方法可以这样做:A:对WA1进行Web服务调用,以询问令牌是否为有效的会话令牌。B:WA1持续存在于数据库或文件系统和WA2从那里寻找。),如果有效,则兑现请求。这里的问题是要确保WA1中的会话到期时令牌无效。

我想知道这种方法是否足够好,还是有更好的方法来做到这一点?

谢谢

M·拉瑟

最佳答案

默认情况下,Servlet API使用cookie(通常名为jsessionid)在每个浏览器中存储会话ID。然后,浏览器随每个请求将cookie传递到服务器。只要两个tomcat实例都在同一个域中,它们都应该可以访问该cookie。除非我没有丢失任何东西,否则仅是在第二个应用程序中测试该cookie的问题。

更新:即使tomcat的每个实例都在不同的域中运行,它们仍然可以通过调用Cookie类的setDomain(String domainPattern)方法来共享这些cookie。

10-08 19:31