现象:
如果js端用了jsonp跨域的请求方式,并且CI配置文件设置了$config['sess_time_to_update'] = xxx;
那么,在xxx秒后点击页面发送请求,帐号会被退出;
原因:
在文件:system/libraries/Session/Session.php构造函数中有这样一段:
if ((empty($_SERVER['HTTP_X_REQUESTED_WITH']) OR strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest')
&& ($regenerate_time = config_item('sess_time_to_update')) > 0
)
{
if ( ! isset($_SESSION['__ci_last_regenerate']))
{
$_SESSION['__ci_last_regenerate'] = time();
}
elseif ($_SESSION['__ci_last_regenerate'] < (time() - $regenerate_time)){
$this->sess_regenerate((bool) config_item('sess_regenerate_destroy'));
}
}
如果不是ajax请求,超过xxx秒CI会重新生成session_id;
解决:
对jsonp请求特殊处理 $_SERVER['HTTP_X_REQUESTED_WITH']) = 'xmlhttprequest';