我有两个应用程序在 Tomcat 上运行,JSF 2 Mojarra 2。这两个应用程序都映射到同一个域,但每个应用程序都映射到该域中的不同模式。一个应用程序用作首页,而另一个应用程序用于访问 protected 资源(不要问为什么不全部放在一个应用程序中,它被故意设计为将应用程序分离为两个不同的实体,每个实体负责自己的事情)。现在的问题是:是否可能,如果可能,如何在这两个单独的应用程序之间传递 session 状态。为了说明这里有一些常见的情况:
用户在运行网站的主应用程序上做了一些事情,然后登录,在登录新应用程序后,他/她正在做的任何事情都会被带到新 session 。
<(我认为这个稍微复杂一些)用户在第一个应用程序中注册,并在成功注册到另一个应用程序后自动登录。您必须登录的应用程序使用 j_security_check 表单登录(这将是困难的部分)
最佳答案
几种方式:
将数据存储在数据库中,并通过一个长的、唯一的、难以猜测的自动生成的 key 来识别它,而您又将其存储在域范围的 cookie 中。这样,两个应用程序都可以根据在 cookie 中找到的 key 从数据库中获取数据。
公开
ServletContext
这两个应用程序的相互。在Tomcat中,这是添加crossContext="true"
的问题到<Context>
Web 应用程序的元素context.xml
.这样你们就可以得到对方的ServletContext
通过ServletContext#getContext().
最后放一些Map<String, SomeData>
其中由两个应用程序共享的某个 ID 键入,例如登录用户 ID(您应该只确保同一用户不能有多个 session )。
关于session - 在两个不同的应用程序之间传递 session 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7999600/