即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为啥?

Posted

技术标签:

【中文标题】即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为啥?【英文标题】:New session entries are being created in database even when codeigniter session library is not loaded. Why?即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为什么? 【发布时间】:2017-12-31 16:55:49 【问题描述】:

我在使用 Chris Kacerguis 的 CodeIgniter REST 服务器时遇到了一个相当奇怪的问题。

问题:

1) 我没有加载 CodeIgniter 会话库,即使这样,每次我向我的 REST Api 发出 HTTP 请求时,都会在 ci_sessions 数据库表中创建新条目。

2) 在每次 HTTP 请求时,都会在数据库中创建一个全新的条目(并且不会更新旧条目),即使 IP 地址保持不变也是如此。

这是我的 config.php 文件:

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 0;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = TRUE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = TRUE;

$config['cookie_prefix']    = '';
$config['cookie_domain']    = '';
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;

我尝试了以下几种方法:

$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 0;
$config['sess_regenerate_destroy'] = FALSE;

$config['cookie_domain']    = '.mydomain.com';

但没有任何效果。

这是正常现象还是某种错误?我究竟做错了什么?其他人有同样的问题吗?

另一件事是,我在 vanilla CodeIgniter 中没有遇到这个问题。在那里,一切正常,如预期的那样。

更新

我在解决问题的第二部分时发现了一些东西。

在发出第一个 HTTP 请求时,在数据库中创建了两个会话条目 - 一个用于客户端,另一个用于 REST 服务器。从第二个请求开始,cookie 的客户端“版本”正在更新,而服务器“版本”正在重新生成。

【问题讨论】:

检查自动加载? 已经检查并再次检查。会话不存在。 您用于执行 REST API 的任何库都可能正在使用会话。 好点。我正在检查那个并回复你。 感谢我的朋友。我完全错过了你提到的图书馆部分。是的,这就是问题所在。我正在使用@BenEdmunds 的 Ion Auth 库,Ion_auth.php 库文件在其中加载 CI 会话。 【参考方案1】:

对于问题的第一部分:

正如@JamesLalor 在 cmets 中指出的那样,

    您必须自动加载会话

    您正在使用一些外部库,而该库又会加载会话库。

对于第二部分的问题:

以下解决方案可能不是最好的,但它对我有用。

在以下情况下会出现多个会话创建问题:

    您在同一个 CodeIgniter 应用程序目录中同时拥有 REST 服务器和客户端

    自动加载会话库

对于客户来说,用户就是消费者。为用户创建一个会话,具有该用户的 IP 地址。在用户的浏览器上设置一个 cookie,用于验证会话并根据验证更新(或新创建)。

对于 REST 服务器,客户端是消费者。这里还创建了一个会话(如果满足上述条件 1 和 2),但这次是针对 Client 的,并且该会话具有 Client 所在服务器的 IP 地址(如果满足上述条件 1 ,那么它就是您的应用所在服务器的 IP 地址)。但这一次无法设置 cookie,因为消费者不是浏览器。因此,会话验证失败,并且每次页面加载时都会创建一个新会话。

解决方案:

REST 是无状态的,每个请求都应包含完成请求所需的所有信息。因此,在 REST 服务器上使用会话(其唯一工作是维护用户状态)被认为是一种不好的做法。客户端的工作是维护用户的会话并将所需的信息传递给每个请求的 REST 服务器。

因此,假设您不需要 REST 服务器中的会话,解决方案是 autoload[‘libraries’] 列表中删除 session,在 autoload.php 文件中,并在客户端构造函数中加载库(或当您需要时)

对于语法错误和/或英语不好,我们深表歉意。这不是我的母语。

【讨论】:

以上是关于即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Laravel 中的会话/cookie 刷新?

为啥即使未启用 CORS,HTTP 请求也会在 Action 中处理? [复制]

Codeigniter 会话未保存在生产服务器上

即使没有分派任何操作,Redux 状态也会在加载时更改

在 Codeigniter 3 中扩展会话库

codeigniter 返回“消息:未定义的属性:Welcome::$load”试图加载帮助程序库