我有一个用codeigniter编写的应用程序。 我使用CI提供的会话库进行会话管理。 它是实时部署的。
当我将应用程序连接到我的实验室(学院)网络中的WiFi或LAN时,会话数据将被随机取消设置。然后该应用程序注销当前用户。
但是当我将其连接到热点时,它可以正常工作。 所以我想问一下会话是否受网络类型的影响。
答案 0 :(得分:1)
监视日志后, 我了解以下几点,
sess_match_ip
中有一个参数然后,您必须检查会话库中的以下循环是否正在执行,
if ($this->sess_match_ip == TRUE AND $session['ip_address'] != $this->CI>input->ip_address())
{
$this->sess_destroy();
return FALSE;
}
如果是,那么您需要注释掉循环或完全删除该代码块。 我知道这不是永久解决方案,但对我有用。
发生这种情况的原因是
某些网络非常快速地切换ip,因此,根据提到的代码,如果令牌创建和请求时的IP不同,则该会话将被破坏。
谢谢。
答案 1 :(得分:0)
如果您登录时更改了IP ,并且似乎导致用户注销,则可能是因为可以配置(或不配置)CI会话来强制绑定会话到一个IP地址。请注意,虽然这很容易配置,但是如果您使用CI的数据库驱动程序获取会话数据,则需要根据分配给此参数的值来更改会话表
application / config / config.php
| 'sess_match_ip'
|
| Whether to match the user's IP address when reading the session data.
|
| WARNING: If you're using the database driver, don't forget to update
| your session table's PRIMARY KEY when changing this setting.
$config['sess_match_ip'] = FALSE;
将FALSE
设置为值将允许用户即使IP更改也保持登录状态。您的会话配置可能设置为TRUE
,这意味着不同的客户端IP将导致会话不再有效。
如果您不使用数据库作为会话驱动程序,则只需更改sess_match_ip
参数即可。
如果您使用数据库进行会话,则需要执行的更改位于CI文档中:
具体来说,这个:
You will also need to add a PRIMARY KEY depending on your ‘sess_match_ip’ setting. The examples below work both on MySQL and PostgreSQL:
// When sess_match_ip = TRUE
ALTER TABLE ci_sessions ADD PRIMARY KEY (id, ip_address);
// When sess_match_ip = FALSE
ALTER TABLE ci_sessions ADD PRIMARY KEY (id);
// To drop a previously created primary key (use when changing the setting)
ALTER TABLE ci_sessions DROP PRIMARY KEY;