org.apache.shiro.session.mgt.DelegatingSession 实现要求 SessionKey 参数 returns 是一个非空的 sessionId

The org.apache.shiro.session.mgt.DelegatingSession implementation requires that the SessionKey argument returns a non-null sessionId

我们使用 Apache Shiro 已经有一段时间了,没有遇到任何问题,但最近发现用户在尝试登录或刚退出我们的应用程序时遇到以下错误:

java.lang.IllegalArgumentException:org.apache.shiro.session.mgt.DelegatingSession 实现要求 SessionKey 参数 returns 一个非空 sessionId 以支持 Session.getId() 调用。

可能是什么原因造成的?

原来问题正是错误消息所述 - 我们在会话数据中缺少 "id" 字段。

这是怎么发生的?我们有多个应用程序读取和写入我们的会话数据,这些数据存储在 Redis 中以支持单点登录。

写入此存储的应用程序之一将我们的会话数据写为 json,没有 "id" 属性,该属性对应于存储在 cookie 中的会话 ID。

例如,错误的会话数据如下所示:

{
  "lastAccessTime": "2016-09-21T12:35:00.018526Z",
  "startTimestamp": "2016-09-21T12:35:00.018526Z",
  "timeout": 1800000
}

良好的会话数据看起来像这样(至少)- 请注意,有一个 "id" 属性,它与存储在会话 cookie 中的会话 ID 相匹配。

{
  "id": "f9b4f222-2660-4318-aae9-ba5f455d560",
  "lastAccessTime": "2016-09-21T12:40:44.813222Z",
  "startTimestamp": "2016-09-21T12:40:42.592Z",
  "timeout": 1800000
}

所以我们所要做的就是让该应用程序添加 "id" 属性,它解决了问题!