我正在使用ionAuth&它似乎几乎随机地把我退出了?我正在使用Codeigniter v2.1.4 - 它记录完全正常但是ionAuth似乎以随机间隔注销,有没有办法强制会话保持活动状态,直到我调用ionAuth->注销函数?
我的CI配置如下所示:
$config['sess_cookie_name'] = 'cisession';
$config['sess_expiration'] = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie'] = FALSE;
$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update'] = 600;
我的ion_auth配置文件如下所示:
$config['user_expire'] = 0;
$config['user_extend_on_login'] = FALSE;
任何人都可以给我任何关于可能导致问题的指示吗?
答案 0 :(得分:16)
问题的原因是执行AJAX调用时会话cookie轮换,CodeIgniter 3中包含正确的修复
您有四种选择:
<强>应对:强> 我之前自己遇到过这个问题而不知道究竟是什么原因。简而言之,我保存了每个XMLHttpRequest的承诺,如果遇到HTTP状态代码401,客户端应用程序将以弹出窗口的形式请求凭据,然后重试AJAX承诺。
客户端使用jQuery,只需添加此ajaxError处理程序:
$(document).ajaxError(function (e, xhr, settings, exception) {
if (xhr.status == 401)
{
// open your popup
$('#login-popup').modal('open');
// attach the xhr object to the listener
$(document).bind( "retry-xhr", {
xhro: xhr
},
function( event ) {
// retry the xhr when fired
$.ajax( event.data.xhro );
});
}
});
当您重新登录时,只需拨打此电话重试您的请求:
$(document).trigger('retry-xhr');
服务器端,您只需要在构造函数中添加if
if (!$this->session->userdata('logged_in') && $this->input->is_ajax_request())
{
$this->output->set_status_header('401');
exit;
}
这很有用,因为有些用户会让他们的网络应用程序窗口在一夜之间打开,并且会话超时会启动。然后用户会打电话给我关于无法执行任何AJAX功能,我必须告诉他们按F5
PS。如果在Angular上,我已经成功使用了HTTP Auth Interceptor模块
<强>哈克:强> 看到这篇文章,他的解决方案是在ci_session表中创建另一个字段并检查两个cookie,这样你的会话在轮换后仍然有效。
它还详细解释了导致此故障的原因
http://www.hiretheworld.com/blog/tech-blog/codeigniter-session-race-conditions
<强>升级:强> 开始使用已经修复的下一个版本:
https://github.com/EllisLab/CodeIgniter/tree/release/3.0
<强>修补程序强> 替换system / libraries / Session.php中的第346行(函数sess_update())
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
使用:
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now || $this->CI->input->is_ajax_request())