2012-08-22 82 views
14

我使用codeigniter作为框架。在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; 
+1

会发生这种情况在所有浏览器会话中重新定向问题?你有没有尝试从其他函数访问会话值然后构造?错误日志中是否有错误或通知? –

+0

我不知道这是否会帮助,但尝试改变sess_use_database为真? –

+0

是的,这发生在所有浏览器上。我没有从其他功能访问值,我直接重定向到规划师。没有错误。 – Zatanna

回答

2

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

如果这没有用,也许这是一些编码问题。尝试在设置之前加密会话项目,并在需要时使用解密。

0

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

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

干杯!

1

我解决了这个问题,通过配置$配置[“cookie_domain”]为localhost

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

我最初有这样的变量设置为完全合格的域名,如www.exampledomain.com但同时,我用本地服务器。

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

0

从我的经验,这些问题可以是:

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

我有类似的问题,事实证明这个问题是非常司空见惯......

根我的问题邪恶的是包含字符“_”

例如姓名,之前曾是

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

后成为

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

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

0

与我同样的问题。

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

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

在Codeigniter重定向后会话丢失

我也发现了问题。

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

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

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

enter image description here

当您更改有关设置,请删除或清除浏览器的所有脱机数据和笨的所有会议文件。然后你试着再做一次。这可能是修复问题。

如果您仍然无法修复问题。您可以再次从codeigniter.org下载codeigniter软件包,然后解压缩以获取测试环境。

0

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

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

如:

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

中重用,只要做到这一点:

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

希望这有助于。

0

你应该补充说明一件事你autoload.php文件。

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

这将解决