CI 2.0.3 сессия heisenbug: сессия теряется через 20 минут, только при перенаправлении сервера, ничего подозрительного в логах - PullRequest
0 голосов
/ 25 января 2012

Я не могу добиться какого-либо прогресса с этим. Мои настройки сеанса CI таковы:

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 0;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = TRUE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = FALSE;
$config['sess_time_to_update']  = 7200;
$config['cookie_prefix']    = "";
$config['cookie_domain']    = "";
$config['cookie_path']      = "/";
$config['cookie_secure']    = FALSE;

Библиотека сеансов загружается при автозагрузке. Я прокомментировал функцию sess_update, чтобы предотвратить ошибку AJAX, обнаруженную при чтении форума CI.

Таблица ci_sessions в базе данных имеет параметры сортировки utf8_general_ci (была ошибка, которая теряла сеанс после каждого вызова redirect(), и это было связано с тем фактом, что параметры сортировки были latin1_swedish_ci по умолчанию).

Он всегда прерывается после того, как пользователь из моего раздела администратора пытается добавить длинную статью и нажимает кнопку сохранения. Действие сохранения выглядит так:

function save($id = 0){
    if($this->my_model->save_article($id)){
        $this->session->set_flashdata('message', 'success!');
        redirect('admin/article_listing');
    }else{
        $this->session->set_flashdata('message', 'errors encountered');
        redirect('admin/article_add');
    }
}

Если вы потратите более 20 минут и нажмете «Сохранить», статья будет добавлена, но при перенаправлении пользователь выйдет из системы.

Я также включил ведение журнала, и иногда, когда возникает ошибка, я получаю сообщение The session cookie data did not match what was expected. This could be a possible hacking attempt., но только половину времени. В другой половине я ничего не получаю: отображается сообщение, которое я поместил в конце конструктора Session, и больше ничего. Во всех случаях, если я смотрю на куки, хранящиеся в моем браузере, после ошибки первая часть куки не совпадает с хешем.

Кроме того, хотя я знаю, что Codeigniter не использует собственные сеансы, я установил session.gc_maxlifetime на 86400.

Еще одна вещь, которую стоит упомянуть, - я не могу воспроизвести ошибку на своем компьютере, но на всех других компьютерах, которые я тестировал, эта ошибка появляется по той же схеме, что и упомянутая выше.

Если у вас есть идеи о том, что делать дальше, я буду очень признателен за них. Переход на новую версию или использование собственного класса сеанса (старый был для CI 1.7, он все еще будет работать?) - также варианты, которые я готов рассмотреть.

Редактировать : Я провел различие между классом Session в CI 2.0.3 и последним классом CI Session, и они одинаковые.

1 Ответ

0 голосов
/ 26 января 2012

Вот как я это решил: стандарты говорят, что браузер не должен разрешать перенаправления после запроса POST. Метод CI redirect() отправляет редирект 302 по умолчанию. Логичным способом было бы отправить перенаправление 307, которое решило мою проблему, но содержало предостережение о необходимости показать диалог подтверждения о перенаправлении. Другими вариантами являются перенаправление 301 (что означает постоянное перемещение) или, выбранное мной решение, перенаправление javascript.

...