会话 ID 重新生成不适用于并发请求

Session ID regeneration not working for concurrent requests

我已将此问题发布到 CI 论坛,但没有任何答案,所以我在这里尝试。

我正在将 CI 用于 REST API 服务来自单页应用程序的 JSON 调用。 使用 CI 2.x 我在短时间内 "chain" 请求的情况下遇到了会话 ID 重新生成的问题,其中一些请求更改了会话 ID。我希望 CI 3 及其全新的会话库能够修复它。

我升级到了3.0,仔细阅读了session docs,做了一些测试。在我看来,CI 2.x 中出现的问题在 3.0 中仍然存在。

我用一个http请求的例子来解释一下(实际是从一个真实的应用中观察到的):

会话 ID 未更改:

GET ... Request cookies: ci_session=123,
        Response cookies:
GET ... Request cookies: ci_session=123,
        Response cookies:
...

要重新生成会话 ID:

GET ... Request cookies: ci_session=123, 
        Response cookies: ci_session: <deleted>, ci_session: 456

这个请求比前一个返回的请求开始得早,所以它带有旧的会话 ID:

GET ... Request cookies: ci_session=123,
        Response cookies:

但是会话 ID 123 不再有效,因此请求被视为未通过身份验证。

看来,添加到新会话库的锁定并不能阻止这一点。

我的会话配置是:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = <some path>
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 60;
$config['sess_regenerate_destroy'] = TRUE; 

我在初始请求身份验证后使用 session_write_close()。

有没有办法使用 CI 3 来处理这个请求之王?难道我做错了什么? 任何帮助表示赞赏。 谢谢

嗯,首先 - 如果您使用的是会话,则它不是 RESTful API,因为使用会话的全部意义在于维护状态,而 REST 服务必须成为无国籍人。

话虽这么说,sess_regenerate_destroy 设置正是为像您这样的用例创建的。将它设置为布尔值 FALSE,旧的会话 ID 稍后将被垃圾收集器删除,而不是在重新生成时立即删除。这留下了一段时间window,在此期间新旧会话 ID 都可用,并且排队的请求不会被拒绝。