跨多个 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 会话存储的主要内容,如果未能解决你的问题,请参考以下文章

如何跨同一个 Web 应用程序的多个实例存储会话信息? [复制]

跨多个 Web 应用程序的服务器范围功能

使用来自多个表的信息来记录交付的通用或特定 DAO?

创建具有多个一对多关系的 DAO 查询?

使用 VBA-Excel 跨多个数据库进行 SQL 查询

如何在 ASP.NET 中跨多个 Web 应用程序维护相同的会话 ID