跨多个 Web 应用程序使用 dao 的 shiro 会话存储
Posted
技术标签:
【中文标题】跨多个 Web 应用程序使用 dao 的 shiro 会话存储【英文标题】:shiro session store using dao across multiple web applications 【发布时间】:2015-01-19 16:42:54 【问题描述】:Shiro 的 SessionDAO 用于将会话存储在数据库中(作为 blob)。 此会话用于多个 Web 应用程序(启用 shiro) 现在的问题是每个 Web 应用程序都试图在会话中设置属性(自定义类)。 当试图在其他 Web 应用程序中反序列化时,它会抛出 ClassDefNotFoundException 因为它不存在。 有什么办法可以解决这个问题吗? 理想的方法应该是什么?
【问题讨论】:
【参考方案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");
【讨论】:
以上是关于跨多个 Web 应用程序使用 dao 的 shiro 会话存储的主要内容,如果未能解决你的问题,请参考以下文章