【问题标题】:shiro session store using dao across multiple web applications跨多个 Web 应用程序使用 dao 的 shiro 会话存储
【发布时间】:2015-01-19 16:42:54
【问题描述】:
Shiro 的 SessionDAO 用于将会话存储在数据库中(作为 blob)。
此会话用于多个 Web 应用程序(启用 shiro)
现在的问题是每个 Web 应用程序都试图在会话中设置属性(自定义类)。
当试图在其他 Web 应用程序中反序列化时,它会抛出 ClassDefNotFoundException 因为它不存在。
有什么办法可以解决这个问题吗?
理想的方法应该是什么?
【问题讨论】:
标签:
java
session
serialization
shiro
【解决方案1】:
将您的单个会话分成多个会话。从一个可全局访问的会话开始,该会话包含用户的主体和所有其他使用同一会话的 Web 应用程序的特定于应用程序的密钥(仅此而已)。然后,当访问一个孤立的 Web 应用程序时,在缓存中创建一个新的“会话”并将其密钥放入全局会话中。然后,当用户访问隔离的 Web 应用程序时,过滤器应从全局会话中检索密钥并将隔离的 Web 应用程序特定会话绑定到当前线程上下文(然后在执行完成后将其删除)。
main-user-session
|
+--user-principal
|
+--app1-user-session-key
|
+--app2-user-session-key
void filter (HttpRequest req, HttpResponse resp) {
var app1key = sessionCache.get("main-user-session-key")
.get("app1-user-session-key");
Session app1Sess = sessionCache.get(app1key);
threadContext.bind("SESSION", app1Sess);
try {
execute(request, response);
} finally (Exception e) {
threadContext.unbind("SESSION");
}
}