2

我正在用 Java 构建一个无状态的 RESTful 服务器后端,它将由 AngularJS 前端使用。因为它应该是无状态的,所以我不创建会话而是生成访问令牌,更准确地说是 JSON Web 令牌,客户端必须在每个请求上呈现。

令牌包含一个“过期”字段,作为绝对过期日期。但是,我希望对用户不活动有一个额外的到期时间。因此,如果用户每 30 分钟活动一次,我会将访问令牌定义为 24 小时有效。

我可以通过在每个请求上向数据库写入一些内容并验证请求之间的时间来实现这一点,但是对于使用应用程序服务器的会话管理时开箱即用的东西来说,这似乎需要做很多工作。

4

2 回答 2

3

要在服务器端实现 100% 无状态,您需要将状态逻辑推送到客户端。解决方案是:

  • 发出具有 2 个到期日期的 JWT(一个用于会话 - 30 分钟,第二个用于刷新 - 24 小时)
  • 实现为具有先前令牌的同一用户获取新令牌(新令牌具有会话的新到期日期,但刷新相同)
  • 超过任何到期日期时拒绝请求
  • 实现“聪明”的 javascript 客户端,在用户点击 UI 时能够获取新的令牌;您可以通过在令牌距离到期日期超过 25 分钟时跳过刷新请求来优化它
于 2014-10-24T12:42:17.827 回答
0

嗯……大多数时候,要让 REST 100% 正确是很多工作。如果它对您的服务器会话开箱即用,并且您没有从 100% 无状态中获得太多收益,请保持这种状态。

如果你真的必须去无状态,我认为除了强制用户获取新令牌之外别无选择。

于 2014-10-24T04:37:31.623 回答