我使用以下代码从大气资源获取会话:
WebEnvironment env = WebUtils.getRequiredWebEnvironment(r.getAtmosphereConfig().getServletContext());
Session session = new WebSubject.Builder(env.getSecurityManager(), r.getRequest(), r.getResponse()).buildWebSubject().getSession();
我还尝试通过以下方式从会话ID获取会话:
WebEnvironment env = WebUtils.getRequiredWebEnvironment(r.getAtmosphereConfig().getServletContext());
Session s = new Subject.Builder(env.getSecurityManager()).sessionId(sessionId).buildSubject().getSession();
但是,对于具有有效会话的经过身份验证的用户,它会返回具有null主体的会话。
答案 0 :(得分:0)
您编写的代码段正是ShiroInterceptor
所做的。如果您未在.INI
文件中指定会话管理器,则会使用ServletContainerSessionManager
。
来自ServletContainerSessionManager
的文档:
尽管名称如此,但此实现本身并不管理Sessions 因为Servlet容器提供了实际的管理支持。 这个课程主要是为了“冒充”常规的四郎 SessionManager因此可以插入普通的Shiro 纯Web应用程序中的配置。
然而,将会话管理器更改为DefaultWebSessionManager
等其他实现将解决问题,您将能够获得当前的主题和会话。