Сессия потеряна после перенаправления в 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, а затем извлечь пакет для тестовой среды.