Сессия потеряна после перенаправления в 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

Во-первых, вы должны убедиться, что в элементах сеанса нет специальных символов, таких как "\n" или "\ v". Эти персонажи могут привести вашу строку к разрыву посередине. Попробуйте trim() для получения справки.

Если это не используется, возможно, это проблема с кодировкой. Попробуйте зашифровать элемент сеанса перед его настройкой и расшифровать его, когда вам нужно его использовать.

Ответ 2

Я решил эту проблему, настроив $config ['cookie_domain'] на localhost

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

i изначально была установлена ​​эта переменная для полного доменного имени, такого как www.exampledomain.com, но пока я использовал локальный сервер.

Домен, в котором работает ваш script, должен быть таким же, как домен, установленный в $config ['cookie_domain], чтобы избежать непредвиденного сбоя с классом сеанса codeigniter.

Ответ 3

У меня есть аналогичная проблема, и это оказалось, что проблема очень обычная...

корень зла моих проблем были именами, содержащими символ "_"

пример, раньше был

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

после стал

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

Моя проблема решена Спасибо человеку с этим ресурсом http://biostall.com/losing-codeigniter-sessions/

Ответ 4

Вы должны добавить одну вещь в свой файл autoload.php.

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

это решит проблему перерасчета сеанса

Ответ 5

В моем случае после некоторых тестов (с https и http в localhost) ошибка возникает для этой проблемы и не имеет надлежащего значения $config ['cookie_secure'], поэтому вы можете попробовать изменить в config.php:

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

Ура!

Ответ 6

По моему опыту, проблемы могут быть:

  • один (или более) ваших файлов не является "UTF-8 с спецификацией" (если ваш сайт не будет только английским и использовать UTF-8 в качестве кодировки, как у меня). Вы должны изменить все файлы на "UTF-8 с помощью спецификации". Notepad ++ поможет.
  • есть некоторые символы перед тегом php или после? > (лучше возьмите? > out). Пожалуйста, убедитесь, что нет никаких символов, включая пробел.
  • При вызове localhost/xxxxxx в качестве адреса измените его на 127.0.0.1/xxxxxx или ваш LAN IP
  • Я всегда храню сеансы в БД вместо файла (проще для отладки).

Ответ 7

Такая же проблема со мной.

Проверьте, загрузите ли вы библиотеку сеансов в контроллере.

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

Ответ 8

Пожалуйста, проверьте свои ссылки и убедитесь, что они написаны правильно. При написании абсолютных URL-адресов убедитесь, что вы добавили часть "www". Это была проблема в моем случае. Надеюсь, это поможет кому-то.


Хорошо:   header ( "Местоположение: http://www.yourdomain.com/controller/page" );


Плохо (прерывает сеанс):   header ( "Местоположение: http://yourdomain.com/controller/page" );

Ответ 9

Сначала я был шокирован, когда столкнулся с этой проблемой. Это случилось со мной, потому что мои данные сессии имели знак @.

Решение состоит в том, чтобы просто закодировать данные, используя base64_encode.

Например:

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

И для повторного использования просто сделайте это:

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

Надеюсь это поможет.

НОВЫЙ ПОИСК: эта проблема все еще сохраняется в некоторых браузерах и устройствах. Так что это уже не решение проблемы. Например, он работает на Samsung Android, MicroMAX Android, но не на Huawei Android.

Ответ 10

Это слишком поздно, но я столкнулся с той же проблемой, к счастью, я решил эту проблему путем изменения конфигурации, как показано ниже.

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

Надеюсь, это сработает и для вас.

Ответ 11

Просто добавьте приведенный ниже код вверху страницы в файле "url_helper.php" в папке "system/helpers" на вашем сайте codeigniter.

session_start();

Ответ 12

У меня точно такая же проблема и вот что я делаю. Сначала перейдите к файлу 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

Надеюсь это поможет.

Ответ 13

Сессия потеряна после перенаправления в Codeigniter

Я тоже нашел проблему.

Вы все еще столкнулись с проблемой. Обратите внимание на направление сессий codeigniter. Когда ваш браузер посетил ваш сайт и несколько раз обновился, codeigniter сгенерировал больше файлов сеанса в направлении сеанса кодаигнитера.

Вы загружаете сеанс библиотеки загрузки в файл вашего контроллера.

Пожалуйста, обратитесь к следующей настройке config.php.

введите описание изображения здесь

Если вы измените настройку about, удалите или очистите все автономные данные вашего браузера и все файлы сессий codeigniter. Затем вы пытаетесь сделать это снова. Возможно, это проблема.

Если вы не можете устранить проблему. Вы можете снова загрузить пакет codeigniter с codeigniter.org, а затем извлечь пакет для тестовой среды.