2011-04-20 36 views
2

我有意写了'会话感知'而不是'会话共享'应用程序。以下是一个场景:会话感知应用程序

我有一个webapp(WA1)部署在Tomcat的一个实例中。假设所有应用程序都部署在根目录下,并且我们没有处理上下文。此应用程序允许用户登录,在现场完成他们的工作并注销。

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

WA1提供一个页面,该页面包含一个链接到WA2的链接。

现在我在WA1中有一个有效的会话,用于标识用户是谁以及会话是否有效。我希望WA2在遵守WA1提供的页面请求之前知道它。

什么是处理这个问题的最好方法?

我排除了共享会话(除非这是更好的方式,请解释一下),因为WA1本身可以负载均衡,WA2可以负载均衡,并且可以通过两个负载平衡的实例保持共享会话的应用程序可能会得到压倒性的。

我倾向于一种“令牌”机制..其中WA1创建与每个会话相关联的令牌,并使其可以从WA1提供的任何页面将每个网址提供给WA2。 WA2会首先检查令牌,并查看它是否是一个有效的令牌(许多方法可以这样做:A:对WA1发出Web服务调用以询问令牌是否是有效的会话令牌。B:WA1会持续到DB或文件系统和WA2从那里寻找..),并且如果它是有效的,那么遵守请求。这里的问题是确保当WA1中的会话到期时令牌失效。

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

由于

M.相反

回答

1

默认情况下,小服务程序API使用cookie,通常命名为jsessionid,存储会话ID在每个浏览器。然后,浏览器将cookie传递给每个请求的服务器。只要tomcat的两个实例都在同一个域中,他们都应该可以访问该cookie。除非我错过了一些东西,否则只是在第二个应用程序中测试该cookie的问题。

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

+0

感谢elekwent,所以基本上它与描述的'token'方法类似,不同之处在于使用jsessionId + cookie/browser来验证有效会话/令牌,而不是使用token + DB/web-service。现在我们将在同一个域上同时拥有两个tomcat实例,但是我想知道WA2是否也可以位于不同的域中。 – 2011-04-20 17:42:54

+0

是的,当您考虑确定是否存在有效会话的最终结果时,类似。这里没有会话共享,或任何其他复杂的行为。 WA2只需检查jsessionid cookie即可知道用户的浏览器与域中的任何服务器之间是否存在会话。使用cookie的setDomain()方法在WA2移动到另一个域时授予对其的访问权限。 – elekwent 2011-04-20 18:38:08

+0

如果我们使用cookie路由,在WA2中,我们可以读取cookie并获取jsessionid。如何保证jsessionid是由有效的WA1会话生成的有效jsessionid。我相信cookie可以被编辑,如果用户创建了一个包含jessionid的虚拟值的cookie,并且WA2可以找到一个具有'a'值的cookie,这并不能保证它是一个有效的WA1会话。 WA2将不得不在某处查询以验证jsessionid的值,这意味着WA1将不得不响应来自WA2的请求,或者必须保存在WA2可以读取的地方。 – 2011-04-22 14:48:00