Как я могу получить доступ к куки-сессии сеанса CodeIgniter, используя Javascript? - PullRequest
2 голосов
/ 28 января 2011

Я использую библиотеку сеансов CodeIgniter , к которой действительно легко получить доступ на стороне сервера.На стороне клиента файл cookie сеанса выглядит следующим образом (я выделил нужную мне часть):

a: 7: {s: 10: "session_id"; s: 32: "47fe66476b098ff092f2fbdddfa53ffa";s: 10: «ip_address»; s: 9: «127.0.0.1»; s: 10: «user_agent»; s: 50: «Mozilla / 5.0 (Windows; U; Windows NT 5.1; en-US; rv»;s: 13: "last_activity"; s: 10: "1296180527"; s: 7: "user_id"; s: 3: "895"; s: 8: "username"; s: 8: "Summer N"; s: 6:" status "; s: 1:" 1 ";} fc0f1e75c097be7970b815a630bf33ef

Гм. Я хочу получить доступ к" username ", который в настоящее время установлен как 8-символьная строка SummerN. Есть ли очевидный способ разобрать это в javascript? Должен ли я просто использовать регулярные выражения? Или лучше будет создать свой собственный «пользовательский» cookie с более простым форматом данных и просто позволить сеансам CI делать свое дело?отдельно

Ответы [ 3 ]

5 голосов
/ 28 января 2011

Я не верю, что вы можете.

Что вам нужно сделать, это использовать Ajax, чтобы получить его.

// javascript/jquery

$.post(<?php echo site_url('controller/get_session');?>, function(username) {
    // username is your session var
});

// PHP

function get_session() {
    echo $this->session->userdata('username');
}
2 голосов
/ 28 января 2011

Ну, это cookie, так что вы можете просто прочитать значение cookie в JS, и да, вы можете разобрать его с помощью javascript, но это не очень хорошая идея. Это в основном php сериализованные данные, но reg exp может справиться с этим.

Во-первых, вам действительно следует настроить CodeIgniter для шифрования куки-файла сеанса, это будет намного безопаснее, что отрицательно скажется на том, что вы пытаетесь разобрать куки (хорошо)

Вы можете использовать контроллер и получить имя пользователя с помощью ajax, как предложил Торп.

Или, если вам нужно имя пользователя, почему бы вам просто не указать его в переменной javascript в вашем ответе:

<script type='text/javascript'>
var ci_username = '<?php /* awsome php code that echos the username goes here */ ?>';
</script>

Кажется более прямым и надежным, чем интерпретация cookie. И он легко доступен, поэтому вам не нужно ждать возврата вызова ajax, прежде чем он станет доступным.

И если ваш пользователь не вошел в систему, установите для него значение null или что-то в этом роде.

Extra : вам действительно нужно имя пользователя? Если вы не передадите его третьему лицу, ваш веб-сервер всегда будет знать, какое имя пользователя ... это часть сеанса .. (или, может быть, мне не хватает того, что вы пытаетесь сделать)

1 голос
/ 11 февраля 2012

Я согласен с предыдущими постерами, что запрос ajax является оптимальным и что файл cookie должен быть зашифрован, но иногда проект не допускает этого. В моем случае я хотел избежать дополнительных попаданий в серверную часть, и ничего, что хранится в куки, не было личной природы. Итак, вот два моих метода, оба недавно отчеканены, поэтому будьте осторожны, поскольку они не были тщательно протестированы.

Обратите внимание, что cookie сеанса CI обычно представляет собой только сериализованный массив с контрольной суммой MD5 для предотвращения взлома. Я выбрасываю контрольную сумму и не беспокоюсь об этом, поэтому, если вы заботитесь об этом, вам придется настроить этот код. Мой код также не конвертирует объекты или плавающие объекты, они также теряются в драке.

/**
 * Retrieves either a single cookie or the entire set of cookies. The array
 * is indexed by the cookie name.
 * @param cookie - name of the cookie you are interested in; can be null
 * @return - associative array of the cookies, or a string if you asked for a specific one
 * 
 **/
function cookieCutter(cookie){
    var rawcookie = unescape(document.cookie.replace(/\+/g, '%20'));
    var elems = rawcookie.split('=');
    var cookies = {};
    for(var i=0; i < elems.length; i++){
        cookies[elems[i]] = elems[i+1];
        i++;
    }
    if(null != cookie){
      return(cookies[cookie]);
    }
    return(cookies);
}


/**
 * Given a string that represents the contents of a server-side serialized PHP object, this
 * method will parse it out and return the appropriate object.
 * @param str - the serialized string
 * @return love and goodness of name=value pairs as an associative array for each item in the object
 *
 **/
function parseSerializedPHP(str){
    switch(str[0]){
        case 'a':
            var retArray = {};
            var matches = str.match(/a:(\d+):(\{.*\})/);
            var count = parseInt(matches[1]) * 2;
            var subElems = matches[2].match(/((s:\d+:"[^"]*";)|([b|i|f]:\d+))/g);
            for(var i=0; i < subElems.length; i++){
                key = parseSerializedPHP(subElems[i]);
                retArray[key] = parseSerializedPHP(subElems[i+1]);
                i++;
            }
            return(retArray);
            break;

        case 's':
            return(str.split('"')[1]);
            break;

        case 'i':
            return(parseInt(str.match(/\d+/)));
            break;

        case 'b':
            return( parseInt(str.match(/\d+/)) ? true : false );
            break;  
    }
    return(null);
}

Типичное использование выглядит так:

ciSessionItems = parseSerializedPHP(cookieCutter('my_sess_key'));

Наслаждайтесь!

...