Java 跨多个web应用程序使用dao的shiro会话存储

Java 跨多个web应用程序使用dao的shiro会话存储,java,session,serialization,shiro,Java,Session,Serialization,Shiro,Shiro的SessionDAO用于将会话存储在db中(作为blob)。 此会话跨多个web应用程序使用(启用shiro) 现在的问题是每个web应用程序都试图在会话中设置属性(自定义类)。 当尝试在其他web应用程序中反序列化时,它会抛出ClassDefNotFoundException,因为它不存在。 我有办法解决这个问题吗? 理想的方法是什么?将单个会话分为多个会话。从一个全局可访问的会话开始,该会话包含用户的主体以及使用同一会话(而不是其他会话)的所有其他web应用程序的特定于应用程序的

Shiro的SessionDAO用于将会话存储在db中(作为blob)。 此会话跨多个web应用程序使用(启用shiro) 现在的问题是每个web应用程序都试图在会话中设置属性(自定义类)。 当尝试在其他web应用程序中反序列化时,它会抛出ClassDefNotFoundException,因为它不存在。 我有办法解决这个问题吗?
理想的方法是什么?

将单个会话分为多个会话。从一个全局可访问的会话开始,该会话包含用户的主体以及使用同一会话(而不是其他会话)的所有其他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");
    }
}