【问题标题】:session destroying in codeigniter after redirecting重定向后在codeigniter中销毁会话
【发布时间】:2014-08-23 08:01:58
【问题描述】:

在我的登录控制器中,我已将所有用户数据存储在会话中。我也通过打印验证了

all_userdata();

当重定向到另一个控制器 home 时,会话被破坏。请帮我解决这个问题。会话数据如下。

Array
(
[session_id] => 11c8450a10e6f944c97f13841ccea0c2
[ip_address] => 127.0.0.1
[user_agent] => Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36
[last_activity] => 1408779229
[user_data] => 
[id] => 432
[empid] => 1024
[username] => 
[email] => gvsvinayak@gmail.com
[fullname] => G V S Vinayak
[usertype] => staff
[logged_in] => 1
[access] => Array
    (
        [menu] => Array
            (
                [0] => Array
                    (
                        [menu_title] => Home
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [parent] => 0
                        [id] => 1
                    )

                [1] => Array
                    (
                        [menu_title] => Blocked Domains
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [parent] => 0
                        [id] => 2
                    )

                [2] => Array
                    (
                        [menu_title] => List of Companies
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [parent] => 0
                        [id] => 3
                    )

                [3] => Array
                    (
                        [menu_title] => Full Registrations
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [parent] => 3
                        [id] => 4
                    )

                [4] => Array
                    (
                        [menu_title] => Partial Registrations
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [parent] => 3
                        [id] => 5
                    )

                [5] => Array
                    (
                        [menu_title] => Staff
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [parent] => 0
                        [id] => 6
                    )

                [6] => Array
                    (
                        [menu_title] => Add Satff
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [parent] => 6
                        [id] => 8
                    )

                [7] => Array
                    (
                        [menu_title] => View All
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [parent] => 6
                        [id] => 9
                    )

                [8] => Array
                    (
                        [menu_title] => Cloud Instances
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [parent] => 0
                        [id] => 7
                    )

                [9] => Array
                    (
                        [menu_title] => Search
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [parent] => 0
                        [id] => 10
                    )

            )

        [companytabs] => Array
            (
                [0] => Array
                    (
                        [tab_name] => Company Profile
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [id] => 1
                    )

                [1] => Array
                    (
                        [tab_name] => VM Details
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [id] => 2
                    )

                [2] => Array
                    (
                        [tab_name] => Support
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [id] => 3
                    )

                [3] => Array
                    (
                        [tab_name] => Monitors
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [id] => 4
                    )

                [4] => Array
                    (
                        [tab_name] => Users
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [id] => 5
                    )

                [5] => Array
                    (
                        [tab_name] => Orders
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [id] => 6
                    )

                [6] => Array
                    (
                        [tab_name] => Invoices
                        [can_edit] => 1
                        [can_delete] => 1
                        [can_view] => 1
                        [id] => 7
                    )

            )

    )

)

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    这与我在 IE7/IE8 上进行测试时遇到的问题相同。
    我在这里找到了一个解决方案http://www.philsbury.co.uk/blog/code-igniter-sessions

    这是一个有人为第三方修复的问题,它修补了会话控制器。看看上面的链接说了什么,


    解决方案:

    1) 为此,您必须在 application/libraries 目录中创建一个新文件 Session.php
    2) 将以下源代码复制到新建的文件中。

    <?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
    
    /**
    * Session class using native PHP session features and hardened against session fixation.
    *
    * @package     CodeIgniter
    * @subpackage  Libraries
    * @category    Sessions
    * @author      Dariusz Debowczyk
    * @link        http://www.codeigniter.com/user_guide/libraries/sessions.html
    */
    class CI_Session {
    
        var $flash_key = 'flash'; // prefix for "flash" variables (eg. flash:new:message)
    
        function CI_Session()
        {
            $this->object =& get_instance();
            log_message('debug', "Native_session Class Initialized");
            $this->_sess_run();
        }
    
        /**
        * Regenerates session id
        */
        function regenerate_id()
        {
            // copy old session data, including its id
            $old_session_id = session_id();
            $old_session_data = $_SESSION;
    
            // regenerate session id and store it
            session_regenerate_id();
            $new_session_id = session_id();
    
            // switch to the old session and destroy its storage
            session_id($old_session_id);
            session_destroy();
    
            // switch back to the new session id and send the cookie
            session_id($new_session_id);
            session_start();
    
            // restore the old session data into the new session
            $_SESSION = $old_session_data;
    
            // update the session creation time
            $_SESSION['regenerated'] = time();
    
            // session_write_close() patch based on this thread
            // http://www.codeigniter.com/forums/viewthread/1624/
            // there is a question mark ?? as to side affects
    
            // end the current session and store session data.
            session_write_close();
        }
    
        /**
        * Destroys the session and erases session storage
        */
        function destroy()
        {
            unset($_SESSION);
            if ( isset( $_COOKIE[session_name()] ) )
            {
                setcookie(session_name(), '', time()-42000, '/');
            }
            session_destroy();
        }
    
        /**
        * Reads given session attribute value
        */    
        function userdata($item)
        {
            if($item == 'session_id'){ //added for backward-compatibility
                return session_id();
            }else{
                return ( ! isset($_SESSION[$item])) ? false : $_SESSION[$item];
            }
        }
    
        /**
        * Sets session attributes to the given values
        */
        function set_userdata($newdata = array(), $newval = '')
        {
            if (is_string($newdata))
            {
                $newdata = array($newdata => $newval);
            }
    
            if (count($newdata) > 0)
            {
                foreach ($newdata as $key => $val)
                {
                    $_SESSION[$key] = $val;
                }
            }
        }
    
        /**
        * Erases given session attributes
        */
        function unset_userdata($newdata = array())
        {
            if (is_string($newdata))
            {
                $newdata = array($newdata => '');
            }
    
            if (count($newdata) > 0)
            {
                foreach ($newdata as $key => $val)
                {
                    unset($_SESSION[$key]);
                }
            }
        }
    
        /**
        * Starts up the session system for current request
        */
        function _sess_run()
        {
            session_start();
    
            $session_id_ttl = $this->object->config->item('sess_expiration');
    
            if (is_numeric($session_id_ttl))
            {
                if ($session_id_ttl > 0)
                {
                    $this->session_id_ttl = $this->object->config->item('sess_expiration');
                }
                else
                {
                    $this->session_id_ttl = (60*60*24*365*2);
                }
            }
    
            // check if session id needs regeneration
            if ( $this->_session_id_expired() )
            {
                // regenerate session id (session data stays the
                // same, but old session storage is destroyed)
                $this->regenerate_id();
            }
    
            // delete old flashdata (from last request)
            $this->_flashdata_sweep();
    
            // mark all new flashdata as old (data will be deleted before next request)
            $this->_flashdata_mark();
        }
    
        /**
        * Checks if session has expired
        */
        function _session_id_expired()
        {
            if ( !isset( $_SESSION['regenerated'] ) )
            {
                $_SESSION['regenerated'] = time();
                return false;
            }
    
            $expiry_time = time() - $this->session_id_ttl;
    
            if ( $_SESSION['regenerated'] <=  $expiry_time )
            {
                return true;
            }
    
            return false;
        }
    
        /**
        * Sets "flash" data which will be available only in next request (then it will
        * be deleted from session). You can use it to implement "Save succeeded" messages
        * after redirect.
        */
        function set_flashdata($key, $value)
        {
            $flash_key = $this->flash_key.':new:'.$key;
            $this->set_userdata($flash_key, $value);
        }
    
        /**
        * Keeps existing "flash" data available to next request.
        */
        function keep_flashdata($key)
        {
            $old_flash_key = $this->flash_key.':old:'.$key;
            $value = $this->userdata($old_flash_key);
    
            $new_flash_key = $this->flash_key.':new:'.$key;
            $this->set_userdata($new_flash_key, $value);
        }
    
        /**
        * Returns "flash" data for the given key.
        */
        function flashdata($key)
        {
            $flash_key = $this->flash_key.':old:'.$key;
            return $this->userdata($flash_key);
        }
    
        /**
        * PRIVATE: Internal method - marks "flash" session attributes as 'old'
        */
        function _flashdata_mark()
        {
            foreach ($_SESSION as $name => $value)
            {
                $parts = explode(':new:', $name);
                if (is_array($parts) && count($parts) == 2)
                {
                    $new_name = $this->flash_key.':old:'.$parts[1];
                    $this->set_userdata($new_name, $value);
                    $this->unset_userdata($name);
                }
            }
        }
    
        /**
        * PRIVATE: Internal method - removes "flash" session marked as 'old'
        */
        function _flashdata_sweep()
        {
            foreach ($_SESSION as $name => $value)
            {
                $parts = explode(':old:', $name);
                if (is_array($parts) && count($parts) == 2 && $parts[0] == $this->flash_key)
                {
                    $this->unset_userdata($name);
                }
            }
        }
    }
    ?>
    


    3) 然后加载库,

    $this->load->library('session');
    

    【讨论】:

      【解决方案2】:

      我在 config.php 中更新了以下值来解决问题:

      $config['cookie_domain'] = 'mydomain.com';   // enter your domain name
      
      $config['cookie_secure'] = FALSE; // set "TRUE" only for https sites
      

      【讨论】:

        【解决方案3】:

        我通过在配置文件中设置这个参数解决了这个问题:

        $config['cookie_domain']= ''; 
        

        【讨论】:

          【解决方案4】:

          这是您拥有的 Codeigniter 版本。最好的方法是编辑会话写入和读取。打开这个文件

          系统/库/Session/session.php

          去281号线

          ini_set('session.name', $params['cookie_name']); 
          

          将 session.name 替换为 session.id

          ini_set('session.id', $params['cookie_name']);
          

          【讨论】:

          • 这在 CodeIgniter 版本 3.0.6 中对我有用。谢谢@gangi
          【解决方案5】:

          最好使用 $config['sess_driver'] = 'database' 将会话存储在数据库中。

          首先是配置,

          $config['sess_table_name'] = 'your_sessions_table';
          $config['sess_driver'] = 'database';
          $config['sess_cookie_name'] = 'yoursite_sessions';
          $config['sess_expiration'] = 7200;
          $config['sess_save_path'] = NULL;
          $config['sess_match_ip'] = FALSE;
          $config['sess_time_to_update'] = 300;
          $config['sess_regenerate_destroy'] = FALSE;
          

          然后是 cookie,

          $config['cookie_prefix']    = 'yourcookie';
          $config['cookie_domain']    = 'cookie.domain'; //use your domain name.  For multisite configuration use '.yourdomain.com'
          $config['cookie_path']      = '/';
          $config['cookie_secure']    = FALSE;
          $config['cookie_httponly']  = FALSE;
          

          最后,创建一个会话表,

          CREATE TABLE `your_sessions_table` (
            `id` varchar(40) NOT NULL,
            `ip_address` varchar(45) NOT NULL,
            `timestamp` bigint(20) NOT NULL DEFAULT '0',
            `data` text NOT NULL
          ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
          

          这样,在你打电话之前,你永远不会丢失会话

          $this->session->sess_destroy();
          

          【讨论】:

            【解决方案6】:

            我设置了这两个选项,然后只有它在 Codeigniter 3.1.0 中工作

            $config['cookie_domain'] = 'mydomain.com';   // enter your domain name
            
            $config['cookie_secure'] = FALSE; // set "TRUE" only for https sites
            

            最好的方法是编辑会话写作和阅读

            system/libraries/Session/session.php
            

            去281号线

            ini_set('session.name', $params['cookie_name']); 
            

            将 session.name 替换为 session.id

            ini_set('session.id', $params['cookie_name']);
            

            【讨论】:

              猜你喜欢
              • 2013-10-06
              • 2018-12-05
              • 2022-08-20
              • 2016-04-01
              • 2012-03-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-23
              相关资源
              最近更新 更多