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

时间:2017-07-25 16:24:37

标签: mysql codeigniter session codeigniter-restserver

我对Chris Kacerguis的CodeIgniter REST服务器有一个相当奇怪的问题。

问题:

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

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

这是我的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。正在重新生成。

1 个答案:

答案 0 :(得分:2)

问题的第一部分:

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

  1. 您必须自动加载会话

    或者

  2. 您正在使用一些外部库,而后者又会加载会话库。

  3. 问题的第二部分:

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

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

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

    2. 会话库已自动加载

    3. 对于客户,用户是消费者。为用户创建会话,具有该用户的IP地址。在用户的浏览器上设置cookie,根据验证对会话进行验证和更新(或新创建)。

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

      <强> 解决方案:

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

      因此,假设您不需要REST Server中的会话,解决方案是在ACCESS-TOKEN文件中session列表中删除autoload[‘libraries’],并加载库在Client构造函数中(或在您需要时)

      抱歉语法错误和/或英语不好。这不是我的母语。