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

时间:2015-04-21 11:03:31

标签: php ajax session codeigniter-3

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

我正在使用CI作为REST API,从单页应用程序提供JSON调用。 使用CI 2.x我在链接"的情况下遇到了会话ID重新生成的问题。请求在短时间内,而其中一些请求更改了会话ID。我希望CI 3及其全新的会话库能解决它。

我升级到3.0,仔细阅读会话文档并做了一些测试。从我的角度来看,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用于此请求之王?难道我做错了什么? 任何帮助表示赞赏。 谢谢

1 个答案:

答案 0 :(得分:2)

嗯,首先 - 如果您正在使用会话,那么它不是RESTful API,因为使用会话的重点是维护状态,而REST服务必须是无状态的。 / p>

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