我对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。正在重新生成。
答案 0 :(得分:2)
问题的第一部分:
正如@JamesLalor在评论中指出的那样,
您必须自动加载会话
或者
您正在使用一些外部库,而后者又会加载会话库。
问题的第二部分:
以下解决方案可能不是最好的,但它对我有用。
在以下情况下会出现多个会话创建问题:
您在同一个CodeIgniter应用程序目录中同时拥有REST服务器和客户端
和
会话库已自动加载
对于客户,用户是消费者。为用户创建会话,具有该用户的IP地址。在用户的浏览器上设置cookie,根据验证对会话进行验证和更新(或新创建)。
对于REST服务器,客户端是使用者。这里也创建了一个会话(如果满足上述条件1和2),但这次是客户端,并且该会话具有客户端所在服务器的IP地址(如果满足上述条件1) ,然后它是您的应用所在的同一服务器的IP地址)。但这次无法设置cookie,因为消费者不是浏览器。因此,会话验证失败,每次加载页面时都会创建一个新会话。
<强> 解决方案: 强>
REST是无状态的,每个请求都应包含完成请求所需的所有信息。因此,在REST服务器上使用会话(其唯一的工作是维护用户的状态)被认为是一种不好的做法。客户端的任务是维护用户的会话,并在每个请求上将所需信息传递给REST服务器。
因此,假设您不需要REST Server中的会话,解决方案是在ACCESS-TOKEN
文件中从session
列表中删除autoload[‘libraries’]
,并加载库在Client构造函数中(或在您需要时)。
抱歉语法错误和/或英语不好。这不是我的母语。