Не удается получить идентификатор сеанса с использованием класса сеанса в CodeIgniter - PullRequest
2 голосов
/ 01 августа 2010

у меня есть этот код в моем контроллере

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 ]

7 голосов
/ 02 августа 2010

На какое время истек срок действия ваших файлов 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');
1 голос
/ 10 июля 2012

У меня просто возникла эта проблема, вызовы ajax разрушают мой сеанс пользователя, вошедшего в систему.Вот решение @treeface с CI 2.1.2 в соответствии с предложением мистера Осетра.Я предполагаю, что библиотеки ввода и загрузки не загружаются автоматически в CI_Session, поэтому мне пришлось получить экземпляр объекта CI, чтобы эта работа работала.

1 голос
/ 15 марта 2012

невозможно. Класс 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
            }

}

1 голос
/ 02 августа 2010

По умолчанию CI создает новый sessionid через определенный интервал. Посмотрите на конфиг, чтобы увидеть значение по умолчанию (я считаю, что это 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'];

Таким образом, я могу использовать сессии так же, как и без фреймворка.

0 голосов
/ 13 декабря 2012

Я думаю, вы должны увидеть это http://ellislab.com/forums/viewthread/138823/Это объясняет, как избавиться от проблемы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...