現象:
如果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';