如何防止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-&gt;CI-&gt;input-&gt;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 自动完成

当用户在 WooCommerce 中登录/注销时,如何防止清空购物车?

codeigniter 中的注销功能

自动检测浏览器选项卡中的注销?