会话ID重新生成无法用于并发请求



我已经在CI论坛上发布了这个问题,但没有任何答案,所以我在这里尝试。

我将CI用于一个REST API,该API为来自单页应用程序的JSON调用提供服务。对于CI2.x,我在短时间内"连锁"请求的情况下遇到了会话ID重新生成的问题,而其中一些请求更改了会话ID。我希望CI3及其全新的会话库能够解决这个问题。

我升级到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用于这个请求之王?我做错什么了吗?感谢您的帮助。谢谢

首先,如果您使用会话,它不是一个RESTful API,因为使用会话的全部目的是维护状态,而REST服务必须是无状态的。

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

最新更新