在Codeigniter中重定向后会话丢失

时间:2012-08-22 07:07:53

标签: php codeigniter session redirect

我正在使用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;

13 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我通过将$ config [' cookie_domain']配置为localhost

解决了这个问题
$config['cookie_domain']    = "localhost";

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

运行脚本的域应该与$ config [' cookie_domain]下设置的域相同,以避免使用codeigniter会话类意外失败。

答案 2 :(得分:1)

我遇到了类似的问题,而且这个问题很普遍......

我的问题的罪恶根源是包含角色" _"

的名字

例子,之前是

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

之后

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

我的问题解决了 谢谢使用此资源的人http://biostall.com/losing-codeigniter-sessions/

答案 3 :(得分:0)

在我的情况下,经过一些测试(在localhost中使用https和http),错误就出现了问题而没有正确设置$ config ['cookie_secure'],所以你可以尝试更改config.php:

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

干杯!

答案 4 :(得分:0)

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

  1. 您的一个(或多个)文件ain' UTF-8与BOM' (如果您的网站不仅仅是英文,并且像我一样使用UTF-8作为编码)。您必须使用BOM'将所有文件更改为' UTF-8。 Notepad ++会有所帮助。
  2. php标签之前或之后有一些字符?> (更好的是?> out)。请确保没有任何字符包含空格。
  3. 当调用localhost / xxxxxx作为地址时,将其更改为127.0.0.1/xxxxxx或您的LAN IP
  4. 我总是将会话存储在DB而不是文件中(更容易进行debuging)。

答案 5 :(得分:0)

与我同样的问题。

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

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

答案 6 :(得分:0)

请检查您的链接并确保它们写得正确。撰写绝对网址时,请务必添加“' www”。部分。这是我的问题。我希望这有助于某人。

○:     标题("位置:http://www.yourdomain.com/controller/page");

错误(打破你的会话):     标题("位置:http://yourdomain.com/controller/page");

答案 7 :(得分:0)

我遇到这个问题时起初感到很震惊。它发生在我身上,因为我的会话数据有@符号。

解决方案是使用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。

答案 8 :(得分:0)

您应该在 autoload.php 文件中添加一项内容。

  

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

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

答案 9 :(得分:0)

为时已晚,但幸运的是我遇到了同样的问题,我通过对以下配置进行一些更改来解决此问题。

$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;

希望这对您也有用。

答案 10 :(得分:0)

我有完全相同的问题,这是我的工作。 首先,转到文件system/libraries/Session/Session.php。 在行session_start();上评论140。 在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下方

希望这会有所帮助。

答案 11 :(得分:0)

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

答案 12 :(得分:-1)

在Codeigniter重定向后会话丢失

我也发现了这个问题。

你仍然遇到了这个问题。请注意会话的codeigniter方向。当您的浏览器访问您的网站并刷新一些时间时,codeigniter会在codeigniter的会话方向下生成更多会话文件。

您需要在控制器文件上加载库会话。

请参阅以下config.php设置。

enter image description here

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

如果仍然无法修复问题。您可以再次从codeigniter.org下载codeigniter包,然后提取包以进行测试环境。