【问题标题】:Session lost after redirect in Codeigniter在 Codeigniter 中重定向后会话丢失
【发布时间】:2012-08-17 13:40:46
【问题描述】:

我正在使用 codeigniter 作为框架。

首先,我使用localhost,但是当我更改为我的IP 地址时,登录功能不再起作用。我发现重定向到另一个控制器后会话丢失了。

这是print_r($this->session->all_userdata());的结果

[session_id] => 7b00fa0f8790f48d24446f9eb4e6aab2 
[ip_address] => 10.42.68.71 
[user_agent] => Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.83 Safari/537.1
[last_activity] => 1285962398 
[user_data] =>

如您所见,它没有任何数据传递给user_data,但它是在我测试时在重定向之前设置的。

我将控制器分为两个,第一个是用户 -> 登录功能的处理程序,另一个是规划器,我从用户控制器重定向的链接的处理程序。

users.php(第一控制器):

$this->load->model('users_model');
$this->load->model('mymodel');
$this->load->database();

$email = $this->input->post('email');

$pass = $this->input->post('password');

$type = $this->input->post('type');

// Authenticate the user
$userdata = $this->users_model->auth_user($email,$pass,$type);

if($userdata)
{
    $data = array('FIRSTNAME' => $userdata->FIRSTNAME, 
                  'LASTNAME' => $userdata->LASTNAME, 
                  'EMAIL' => $userdata->EMAIL,
                  'LOGIN' =>TRUE, 'TYPE' => $type);
    $this->session->set_userdata($data);
    redirect('planner/view_system','refresh');
}

planner.php(第二个控制器):

function __construct() {
    parent::__construct();

    if ( ! ($this->session->userdata('LOGIN')))
    { 
        print_r (var_dump($this->session->userdata('FIRSTNAME')));
        print_r($this->session->all_userdata());
    }
    $this->load->helper(array('form','html','url'));

这是我的配置

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = FALSE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = TRUE;
$config['sess_match_useragent'] = FALSE;
$config['sess_time_to_update']  = 300;

【问题讨论】:

  • 所有浏览器都会出现这种情况吗?您是否尝试过从其他函数然后构造函数访问会话值?您的错误日志中是否有错误或通知?
  • 我不确定这是否有帮助,但尝试将 sess_use_database 更改为 true?
  • 是的,所有浏览器都会发生这种情况。我没有从其他函数访问值,我直接重定向到规划器。没有错误。
  • @HeHui 不行,因为我没有为它创建数据库,我不想把它保存在我的数据库中。
  • 那我真的帮不了你。唯一一次我的会话无缘无故消失是当我在同一台服务器上运行多个站点时。我有相同的 session_cookie_name。

标签: php codeigniter session redirect


【解决方案1】:

首先,您必须确保会话项中没有特殊字符,例如“\n”或“\v”。这些字符可能会导致您的字符串在中间中断。请尝试trim() 寻求帮助。

如果没有用,可能是编码问题。尝试在设置会话项之前对其进行加密,并在需要使用时对其进行解密。

【讨论】:

  • 删除特殊字符如_ - |变量名中的 $(以及更多)有助于解决此问题
【解决方案2】:

在我的情况下,经过一些测试(在 localhost 中使用 https 和 http)后,该问题出现了错误,并且没有正确设置 $config['cookie_secure'],因此您可以尝试在 config.php 中进行更改:

$config['cookie_secure']    = FALSE; // if is not under https, or true if you use https

干杯!

【讨论】:

  • 如果你在 /index.php 或 dotenv 中定义了一个 ENVIRONMENT var,你可以这样做 $config['cookie_secure'] = ENVIRONMENT === 'production';
【解决方案3】:

我通过将 $config['cookie_domain'] 配置为 localhost 解决了这个问题

$config['cookie_domain']    = "localhost";

我最初将该变量设置为完全限定的域名,例如 www.exampledomain.com,但同时我使用的是本地服务器。

运行脚本的域应与 $config['cookie_domain] 下设置的域相同,以避免 codeigniter 会话类出现意外故障。

【讨论】:

  • 如果你使用数据库事务 $this->db->trans_begin();确保在代码中的某处有一个结束事务操作 $this->db->trans_rollback();或 $this->db->trans_commit();被称为
【解决方案4】:

根据我的经验,问题可能是:

  1. 您的一个(或多个)文件不是“带有 BOM 的 UTF-8”(如果您的网站不只是英文并且像我的一样使用 UTF-8 作为编码)。您必须将所有文件更改为“带有 BOM 的 UTF-8”。 Notepad++ 会有所帮助。
  2. 在php标签之前或之后有一些字符?>(最好去掉?>)。请确保没有任何字符包括空格。
  3. 当调用localhost/xxxxxx作为地址时,改为127.0.0.1/xxxxxx或者你的局域网IP
  4. 我总是将会话存储在数据库中而不是文件中(更易于调试)。

【讨论】:

    【解决方案5】:

    我也有类似的问题,后来这个问题很常见……

    我的问题的根源是包含字符“_”的名称

    例如,之前是

    $this->session->set_flashdata('message_success', 'some message');
    

    成为之后

    $this->session->set_flashdata('messagesuccess', 'some message');
    

    我的问题解决了 感谢这个资源http://biostall.com/losing-codeigniter-sessions/

    【讨论】:

      【解决方案6】:

      和我一样的问题。

      请检查您是否在控制器中加载了会话库。

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

      【讨论】:

        【解决方案7】:

        请检查您的链接并确保它们写得正确。编写绝对 URL 时,请确保添加“www”部分。这就是我的问题。我希望这对某人有所帮助。


        好: header("位置:http://www.yourdomain.com/controller/page");


        不好(打断你的会话): header("位置:http://yourdomain.com/controller/page");

        【讨论】:

          【解决方案8】:

          在 Codeigniter 中重定向后会话丢失

          我也发现了问题。

          你还是遇到了问题。请注意 codeigniter 的会话方向。当您的浏览器访问您的网站并刷新几次时,codeigniter 在 codeigniter 的 session 方向下生成了更多的 session 文件。

          您在控制器文件上重新加载库会话。

          请参考下面的config.php设置。

          当您更改about设置时,请删除或清除浏览器的所有离线数据和codeigniter的所有会话文件。然后你试着再做一次。它可能是修复问题。

          如果您仍然无法修复问题。您可以再次从codeigniter.org下载codeigniter包,然后将包解压用于测试环境。

          【讨论】:

            【解决方案9】:

            当我遇到这个问题时,我一开始很震惊。这发生在我身上是因为我的会话数据有一个 @ 符号。

            解决方案是简单地使用 base64_encode 对数据进行编码。

            例如:

            $Data = urlencode(  base64_encode($Email) );
            $this->session->set_userdata('Data', $Data);
            

            要重用它,只需这样做:

            $Data = base64_decode( urldecode( $this->session->userdata('Data') ) );
            

            希望这会有所帮助。

            新发现某些浏览器和设备上仍然存在此问题。因此,这不再是真正的解决方案。例如,它适用于三星 Android、MicroMAX And​​roid,但不适用于华为 Android。

            【讨论】:

              【解决方案10】:

              您应该在 autoload.php 文件中添加一件事。

              $autoload['libraries'] = array('database','session');

              这将解决您的会话重定向问题

              【讨论】:

                【解决方案11】:

                为时已晚,但幸运的是我遇到了同样的问题,我通过对配置稍作更改来解决这个问题。

                $config['sess_cookie_name']     = 'ci_session';
                $config['sess_expiration']      = 7200;
                $config['sess_expire_on_close'] = FALSE;
                $config['sess_encrypt_cookie']  = TRUE; // change this
                $config['sess_use_database']    = FALSE;
                $config['sess_table_name']      = 'ci_sessions';
                $config['sess_match_ip']        = TRUE; // change this
                $config['sess_match_useragent'] = TRUE; // change this
                $config['sess_time_to_update']  = 300;
                

                希望这对你也有用。

                【讨论】:

                【解决方案12】:

                我有完全相同的问题,这就是我所做的。 首先,转到文件system/libraries/Session/Session.php。 在140 上评论session_start();。 在function _configure 上,在// Security is king 下注释几行

                //      ini_set('session.use_trans_sid', 0);
                //      ini_set('session.use_strict_mode', 1);
                //      ini_set('session.use_cookies', 1);
                //      ini_set('session.use_only_cookies', 1);
                //      ini_set('session.hash_function', 1);
                //      ini_set('session.hash_bits_per_character', 4);
                

                其次,转到根项目上的文件index.php。 把session_start();放在<?php下面

                希望这会有所帮助。

                【讨论】:

                • 是的,这对我有帮助。但是你能进一步解释为什么会发生这种情况吗?谢谢!
                • 问题,它安全吗?
                【解决方案13】:

                我遇到了同样的问题,在我的情况下,会话文件夹的权限不足。 请检查 session.save_path 的 php.ini 和 $config['sess_save_path'] 的 config.php 并确保文件夹的权限设置为 777 或 757。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2021-01-29
                  • 2018-07-07
                  • 2013-01-06
                  • 2017-05-03
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-03-31
                  相关资源
                  最近更新 更多