2012-08-22 275 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');

這將解決