Не удается получить идентификатор сеанса с использованием класса сеанса в CodeIgniter
У меня есть этот код в моем контроллере
class Upload_center extends Controller
{
function __construct()
{
parent::Controller();
$this->load->model('auth_model') ;
if(!$this->auth_model->authorize())
{
redirect('login');
}
}
и у меня есть этот код на мой взгляд
$('#swfupload-control').swfupload({
upload_url: "<?=base_url()?>index.php/upload_center/upload",
file_post_name: 'fileupload',
file_size_limit : "200000000",
file_types : "*.zip;*.rar;*.pdf;*.doc;*.docx;*.mp3;*.avi;*.wmv;*.docx;*.jpg;*.jpeg;*.JPG;*.JPEG;*.png;*.gif;*.bitmap;",
file_types_description : "zip files ",
post_params: {"PHPSESSID": "<?=$this->session->userdata('session_id');?>"} ,
file_upload_limit : 1,
flash_url : "<?=base_url()?>js/jquery-swfupload/js/swfupload/swfupload.swf",
button_image_url : '<?=base_url()?>js/jquery-swfupload/js/swfupload/wdp_buttons_upload_114x29.png',
button_width : 114,
button_height : 29,
button_placeholder : $('#button')[0],
debug: false
Я хочу, чтобы пользователь загружал свои файлы после входа в систему, поэтому у меня есть метод, который требует, чтобы пользователи входили в систему, прежде чем продолжить загрузку файлов. Хотя я использую Flash Uploader, на мой взгляд, он не передает значение сеанса, и PHP считает, что пользователь не вошел в систему, и перенаправляет его на страницу входа. Я отправляю phpsessionid
по почте, но до сих пор не идет.
5 ответов
На какое время истекает ваш сеансовый cookie? В CodeIgniter существует известная ошибка, при которой, если вы остаетесь на странице, которая выполняет AJAX-запросы после истечения срока действия файла cookie, он сбрасывает идентификатор сеанса в базе данных, но не сможет установить его в файле cookie браузера, поскольку он асинхронный. запрос. Это приводит к разъединению при следующем не асинхронном GET-запросе, что приводит к тому, что библиотека сеанса вызывает sess_destroy(). Если это похоже на вашу ситуацию, дайте мне знать. В противном случае, предоставьте более подробную информацию, пожалуйста.
Редактировать: я должен, возможно, также включить исправление для этой ошибки здесь. Создайте файл в /application/library с именем "MY_Session.php" (если он еще не существует). Там вы можете вставить это:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
* Session Class Extension
*/
class MY_Session extends CI_Session {
/*
* Do not update an existing session on ajax calls
*
* @access public
* @return void
*/
function sess_update() {
if ( !isAjax() ){
parent::sess_update();
}
}
}
?>
То есть функция isAjax() - это помощник, который у меня есть в /application/helpers/isajax_helper.php, который выглядит следующим образом:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* is_ajax_call
*
* Determines if the current page request is done through an AJAX call
*
* @access public
* @param void
* @return boolean
*/
if ( ! function_exists('isAjax')) {
function isAjax() {
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
}
}
?>
Который упоминается в моем файле конфигурации, как это:
$autoload['helper'] = array('otherhelper1', 'isajax', 'otherhelper2');
У меня просто была эта проблема, вызовы ajax разрушали мою сессию вошедшего в систему пользователя. Вот решение @treeface с CI 2.1.2 в соответствии с предложением мистера Осетра. Я предполагаю, что библиотеки ввода и загрузки не загружаются автоматически в CI_Session, поэтому мне пришлось получить экземпляр объекта CI, чтобы эта работа работала.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
* Session Class Extension
*/
class MY_Session extends CI_Session {
protected $_CI;
/*
* Do not update an existing session on ajax calls
*
* @access public
* @return void
*/
function sess_update() {
$this->_CI =& get_instance();
if ( !$this->_CI->input->is_ajax_request() ){
parent::sess_update();
}
}
}
Невозможно. Класс Session не использует нативные сессии PHP.
лучшая практика, я рекомендую вам
contoller contain uploadpage {
function index(){
$dataview['session_id'] = $this->secureUpload();
$this->load->view('upload',$dataview);
}
function secureUpload(){
$user_id = $this->session->userdata('cuser_id');
$md5pass = $this->basemodel->_getEncrypPassFromDb($user_id);
$time =time();
$session = md5($user_id.$time.$md5pass)."x".$user_id."x".$time;
return $session;
}
}
страница загрузки
('#swfupload-control').swfupload({
post_params: {"PHPSESSID": "<?=session_id?>"} ,
таким образом расшифруйте ваш безопасный код
function upload_function(){
list($session2, $user_id, $time) = explode("x", $session);
$this->load->library('upload', $config);
$md5pass = $this->basemodel->_getMD5pass($user_id);
$session_server = md5($user_id.$time.$md5pass)."x".$user_id."x".$time;
if($session_server == $session){
upload file by flash upload
}
}
По умолчанию CI создает новый идентификатор сеанса в определенный интервал. Посмотрите на конфиг, чтобы увидеть значение по умолчанию (я считаю, что это 5 минут). Так $this->session->userdata('session_id')
всегда будет содержать другой идентификатор, но CI по-прежнему может знать, кто вы.
Я столкнулся с проблемой по той же причине. Я знаю, почему ребята из CI создали это обновление сессии, но я чувствую, что это усложняет ситуацию. Вы можете переопределить это поведение в своей конфигурации, просто введя более высокое значение для обновления сеанса.
В одном из моих приложений это выглядит так:
$config['sess_expiration'] = 7200;
//$config['sess_time_to_update'] = 300;
$config['sess_time_to_update'] = $config['sess_expiration'];
Таким образом, я могу использовать сессии так же, как и без фреймворка.
Я думаю, что вы должны увидеть это http://ellislab.com/forums/viewthread/138823/
Это объясняет, чтобы избавиться от проблемы