如何防止codeigniter中的自动注销?
Posted
技术标签:
【中文标题】如何防止codeigniter中的自动注销?【英文标题】:How to prevent auto logout in codeigniter? 【发布时间】:2015-06-30 04:54:43 【问题描述】:我正在使用codeigniter
使用ion_auth
配置,mysql 作为后端,
我的应用程序运行顺利,但有时/不是随机的,当我调用 add/update
函数时,它会自动将我注销。
我在过去 1 个月里一直在研究它,但到目前为止还没有找到解决方案?
我还更改了ion_auth
配置文件中的设置。
$config['user_expire'] = 0;
任何想法,解决这个问题? 请发表评论,以便我在需要时提供更多数据。
注意:我也检查了this,但没有运气。
【问题讨论】:
IonAuth - seems to be randomly logging me out的可能重复 那是另一回事,我的应用程序不是随机注销我,而是每天至少 1 或 2 次。 【参考方案1】:您可能正在执行 ajax 请求,这是一个常见问题...
我建议你使用会话数据库并进行 ajax 调用是为了不更新会话...
在你的课上做这个
class MY_Session extends CI_Session
public function sess_update()
$CI =& get_instance();
if ( ! $CI->input->is_ajax_request())
parent::sess_update();
【讨论】:
是的,我正在使用 ajax,但是那些我没有使用 Ajax 的页面呢,这也让我退出了【参考方案2】:使用您自己的 MY_Session.php
库创建一个会话库,该库覆盖了 sess_update
方法,只在非 AJAX 请求时执行更新方法:
MY_Session.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once BASEPATH . '/libraries/Session.php';
class MY_Session extends CI_Session
function __construct()
parent::__construct();
$this->CI->session = $this;
function sess_update()
// Do NOT update an existing session on AJAX calls.
if (!$this->CI->input->is_ajax_request())
return parent::sess_update();
文件位置:
/application/libraries/MY_Session.php */
你可以从config/autoload.php:
自动加载这个库
$autoload['libraries'] = array( 'MY_Session');
或者,您可以稍后加载:
$this->load->library('MY_Session');
这是什么 sess_update();有吗?
在您的system/libraries/Session.php
中有一个function sess_update()
会自动更新您的上次活动。此功能默认每五分钟更新一次会话。
public function sess_update()
// We only update the session every five minutes by default
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
return;
// _set_cookie() will handle this for us if we aren't using database sessions
// by pushing all userdata to the cookie.
$cookie_data = NULL;
/* Changing the session ID during an AJAX call causes problems,
* so we'll only update our last_activity
*/
if ($this->CI->input->is_ajax_request())
$this->userdata['last_activity'] = $this->now;
// Update the session ID and last_activity field in the DB if needed
if ($this->sess_use_database === TRUE)
// set cookie explicitly to only have our session data
$cookie_data = array();
foreach (array('session_id','ip_address','user_agent','last_activity') as $val)
$cookie_data[$val] = $this->userdata[$val];
$this->CI->db->query($this->CI->db->update_string($this->sess_table_name,
array('last_activity' => $this->userdata['last_activity']),
array('session_id' => $this->userdata['session_id'])));
return $this->_set_cookie($cookie_data);
// Save the old session id so we know which record to
// update in the database if we need it
$old_sessid = $this->userdata['session_id'];
$new_sessid = '';
do
$new_sessid .= mt_rand(0, mt_getrandmax());
while (strlen($new_sessid) < 32);
// To make the session ID even more secure we'll combine it with the user's IP
$new_sessid .= $this->CI->input->ip_address();
// Turn it into a hash and update the session data array
$this->userdata['session_id'] = $new_sessid = md5(uniqid($new_sessid, TRUE));
$this->userdata['last_activity'] = $this->now;
// Update the session ID and last_activity field in the DB if needed
if ($this->sess_use_database === TRUE)
// set cookie explicitly to only have our session data
$cookie_data = array();
foreach (array('session_id','ip_address','user_agent','last_activity') as $val)
$cookie_data[$val] = $this->userdata[$val];
$this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid)));
// Write the cookie
$this->_set_cookie($cookie_data);
【讨论】:
如果我在 session.php 构造函数中写if (!$this->CI->input->is_ajax_request()) return parent::sess_update();
会起作用吗
是的,它会起作用。如果您遇到任何错误,请告诉我。
给出这个错误Call to a member function is_ajax_request() on null in C:\xampp\htdocs\projects\oinvoices\system\libraries\Session.php on line 59
检查HTTP_X_REQUESTED_WITH
服务器标头是否已设置,如果是则返回布尔值TRUE,否则返回FALSE。
怎么设置,我不知道【参考方案3】:
替换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())
希望这对你有用。
【讨论】:
【参考方案4】:这是最佳答案。
codeignter controller
function fetchSendToProduction($sku,$old_fab_id)
if($this->input->is_ajax_request() > 0)
$result = $this->ifmodel->fetchSendToProduction($sku,$old_fab_id);
echo json_encode($result);
codeignter view ajax call
$.ajax(
type: "POST",
url: "<?php echo base_url(); ?>index.php/inputFactor/fetchSendToProduction/" + sku+'/'+old_fab_id ,
cache: false,
processData: false,
success: function(data)
);
【讨论】:
以上是关于如何防止codeigniter中的自动注销?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用带有codeigniter的数据库中的JQuery使用自动完成功能?
java spring boot / spring security(HttpSecurity)中的会话到期时如何自动注销
如何使用 codeigniter 让 zend studio 自动完成