在两个不同的应用程序之间传递会话数据
Posted
技术标签:
【中文标题】在两个不同的应用程序之间传递会话数据【英文标题】:Pass session data between two different applications 【发布时间】:2011-12-21 10:12:48 【问题描述】:我有两个应用程序在 Tomcat 上运行,JSF 2 Mojarra 2。两个应用程序都映射到同一个域,但每个都映射到该域中的不同模式。一个应用程序用作首页,而另一个应用程序用于访问受保护的资源(不要问为什么不在一个应用程序中,它被故意设计为将应用程序分隔为两个不同的实体,每个实体负责自己的事情)。现在的问题是:是否有可能,如果有,如何在这两个独立的应用程序之间传递会话状态。为了说明这里有一些常见的情况:
用户在运行网站的主应用程序上执行某些操作,然后登录,并且在登录新应用程序后,他/她正在做的任何事情都会被带到新会话。
李>(我认为这个稍微复杂一些)用户在第一个应用程序中注册,并在成功注册到另一个应用程序后自动登录。您必须登录的应用程序使用 j_security_check 表单登录(这将是困难的部分)
【问题讨论】:
【参考方案1】:几种方式:
将数据存储在 DB 中,并通过一个长的、唯一的、难以猜测的自动生成的密钥来识别它,而该密钥又存储在域范围的 cookie 中。这样,两个应用程序都可以根据在 cookie 中找到的密钥从数据库中获取数据。
将两个应用程序的ServletContext
相互公开。在 Tomcat 中,只需将 crossContext="true"
添加到 Web 应用程序的 context.xml
的 <Context>
元素中即可。这样,您可以通过ServletContext#getContext().
获取彼此的ServletContext
最后将一些Map<String, SomeData>
放在那里,这些Map<String, SomeData>
由两个应用程序之间共享的某个ID 键入,例如登录用户ID(您应该只确保同一用户不能有多个会话)。
【讨论】:
谢谢,非常有帮助。选项二在这里似乎很理想,正是我正在寻找的。我自己考虑过选项 1,但决定反对,我认为坚持这些长度并保留可能没有用的数据不是一个好主意(例如,用户永远不会超出登录点),然后另外管理这一切的维护。仍然不确定如何处理登录 j_security 问题。你说我应该确保同一个用户没有超过一个会话。新的会话是在 login 时创建的。两个应用程序不会存储两个不同的会话吗?以上是关于在两个不同的应用程序之间传递会话数据的主要内容,如果未能解决你的问题,请参考以下文章
在不同服务器上的 ReactJS 和 WIX Web 应用程序之间共享会话