即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为什么?
New session entries are being created in database even when codeigniter session library is not loaded. Why?
我在使用 Chris Kacerguis 的 CodeIgniter REST 服务器时遇到了一个相当奇怪的问题。
问题:
1) 我没有加载 CodeIgniter 会话库,即使在 ci_sessions
数据库 table 中创建新条目,每次我向我的 REST [=45] 发出 HTTP 请求=].
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 的客户端 'version' 正在更新,而服务器 'version' 正在重新生成。
第一部分问题:
正如@JamesLalor 在评论中指出的那样,
您必须自动加载会话
或
您正在使用一些外部库,而这些库又会加载会话库。
对于问题的第二部分:
以下解决方案可能不是最好的,但对我有用。
创建多个会话时出现问题:
您在同一个 CodeIgniter 应用程序目录中同时拥有 REST 服务器和客户端
和
会话库自动加载
对于Client来说,用户就是消费者。为用户创建一个会话,具有该用户的 IP 地址。在用户的浏览器上设置了一个 cookie,用于根据验证验证和更新(或新创建)会话。
对于REST Server来说,Client就是消费者。这里也创建了一个session(如果上面的条件1和2都满足),但是这次是给Client的,这个session有Client所在服务器的IP地址(如果上面的条件1都满足) ,则它是您的应用程序所在的同一服务器的 IP 地址)。但是这次无法设置 cookie,因为消费者不是浏览器。因此,会话验证失败,每次加载页面时都会创建一个新会话。
解法:
REST 是无状态的,每个请求都应该包含完成请求所需的所有信息。因此,在 REST 服务器上使用会话(其唯一工作是维护用户状态)被认为是一种不好的做法。客户端的工作是维护用户会话并在每次请求时将所需信息传递给 REST 服务器。
因此,假设您不需要 REST 服务器内的会话,解决方案是 从 autoload[‘libraries’]
列表中删除 session
,在 autoload.php
文件中,并在客户端构造函数中加载库(或在需要时).
抱歉语法错误and/or英语不好。这不是我的母语。
我在使用 Chris Kacerguis 的 CodeIgniter REST 服务器时遇到了一个相当奇怪的问题。
问题:
1) 我没有加载 CodeIgniter 会话库,即使在 ci_sessions
数据库 table 中创建新条目,每次我向我的 REST [=45] 发出 HTTP 请求=].
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 的客户端 'version' 正在更新,而服务器 'version' 正在重新生成。
第一部分问题:
正如@JamesLalor 在评论中指出的那样,
您必须自动加载会话
或
您正在使用一些外部库,而这些库又会加载会话库。
对于问题的第二部分:
以下解决方案可能不是最好的,但对我有用。
创建多个会话时出现问题:
您在同一个 CodeIgniter 应用程序目录中同时拥有 REST 服务器和客户端
和
会话库自动加载
对于Client来说,用户就是消费者。为用户创建一个会话,具有该用户的 IP 地址。在用户的浏览器上设置了一个 cookie,用于根据验证验证和更新(或新创建)会话。
对于REST Server来说,Client就是消费者。这里也创建了一个session(如果上面的条件1和2都满足),但是这次是给Client的,这个session有Client所在服务器的IP地址(如果上面的条件1都满足) ,则它是您的应用程序所在的同一服务器的 IP 地址)。但是这次无法设置 cookie,因为消费者不是浏览器。因此,会话验证失败,每次加载页面时都会创建一个新会话。
解法:
REST 是无状态的,每个请求都应该包含完成请求所需的所有信息。因此,在 REST 服务器上使用会话(其唯一工作是维护用户状态)被认为是一种不好的做法。客户端的工作是维护用户会话并在每次请求时将所需信息传递给 REST 服务器。
因此,假设您不需要 REST 服务器内的会话,解决方案是 从 autoload[‘libraries’]
列表中删除 session
,在 autoload.php
文件中,并在客户端构造函数中加载库(或在需要时).
抱歉语法错误and/or英语不好。这不是我的母语。