我已将此问题发布到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用于此请求之王?难道我做错了什么? 任何帮助表示赞赏。 谢谢
答案 0 :(得分:2)
嗯,首先 - 如果您正在使用会话,那么它不是RESTful API,因为使用会话的重点是维护状态,而REST服务必须是无状态的。 / p>
话虽这么说,sess_regenerate_destroy
设置是为像你这样的用例创建的。将其设置为布尔值为FALSE,旧的会话ID稍后将由垃圾收集器删除,而不是在重新生成时立即删除。这留下了一个时间窗口,在此期间旧的和新的会话ID都可用,并且排队的请求不会被拒绝。