как кодировать данные cookie - PullRequest
       30

как кодировать данные cookie

3 голосов
/ 01 декабря 2011

Я устанавливаю файл cookie с некоторыми значениями строки запроса для созданной мной страницы, чтобы при повторном посещении страницы у вас была установлена ​​опция.

Так что, если URL-адрес http://mysite.com/index.php?setting1=blue&orientation=horizontal&background=paper cookie сохранит значения setting1=blue, orientation=horizontal и background=paper, которые будут считаны при следующем посещении.

Кажется, что большинство людей советуют json кодировать эти значения перед сохранением в cookie,Тем не менее, я получаю гораздо большие размеры файлов cookie (например, в 4-5 раз больше!) При кодировании json, а не просто сохраняю эти значения в стандартном формате строки запроса и анализирую их позже.

Ответы [ 5 ]

1 голос
/ 03 декабря 2011

Если вы хотите преобразовать строку запроса в объект, взгляните на

myQueryString.parseQueryString () // возвращает объект пар ключ-значение

Требуется mooTools Больше строк: http://mootools.net/docs/more/Types/String.QueryString

Однако мне больше нравится идея Base64! Смотри ниже

Кредит идет на Райана Флоренса для этого, но это то, что я использую:

var cookieData = DATATOENCODE.toBase64() // base64 encodes the data

cookieData.decodeBase64() // to decode it

Магия:

/*
---

script: Base64.js

description: String methods for encoding and decoding Base64 data

license: MIT-style license.

authors: Ryan Florence (http://ryanflorence.com), webtoolkit.info

requires:
- core:1.2.4: [String]

provides: [String.toBase64, String.decodeBase64]

...
*/


(function(){

    // Base64 string methods taken from http://www.webtoolkit.info/
    var Base64 = {

    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

        encode : function (input) {
            var output = "";
            var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
            var i = 0;
            input = Base64._utf8_encode(input);
            while (i < input.length) {
                chr1 = input.charCodeAt(i++);
                chr2 = input.charCodeAt(i++);
                chr3 = input.charCodeAt(i++);
                enc1 = chr1 >> 2;
                enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                enc4 = chr3 & 63;
                if (isNaN(chr2)) {
                    enc3 = enc4 = 64;
                } else if (isNaN(chr3)) {
                    enc4 = 64;
                };
                output = output +
                this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
                this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
            };
            return output;
        },

        decode : function (input) {
            var output = "";
            var chr1, chr2, chr3;
            var enc1, enc2, enc3, enc4;
            var i = 0;
            input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
            while (i < input.length) {
                enc1 = this._keyStr.indexOf(input.charAt(i++));
                enc2 = this._keyStr.indexOf(input.charAt(i++));
                enc3 = this._keyStr.indexOf(input.charAt(i++));
                enc4 = this._keyStr.indexOf(input.charAt(i++));
                chr1 = (enc1 << 2) | (enc2 >> 4);
                chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
                chr3 = ((enc3 & 3) << 6) | enc4;
                output = output + String.fromCharCode(chr1);
                if (enc3 != 64) {
                    output = output + String.fromCharCode(chr2);
                };
                if (enc4 != 64) {
                    output = output + String.fromCharCode(chr3);
                };
            };
            output = Base64._utf8_decode(output);
            return output;
        },

        // private method for UTF-8 encoding
        _utf8_encode : function (string) {
            string = string.replace(/\r\n/g,"\n");
            var utftext = "";
            for (var n = 0; n < string.length; n++) {
                var c = string.charCodeAt(n);
                if (c < 128) {
                    utftext += String.fromCharCode(c);
                } else if((c > 127) && (c < 2048)) {
                    utftext += String.fromCharCode((c >> 6) | 192);
                    utftext += String.fromCharCode((c & 63) | 128);
                } else {
                    utftext += String.fromCharCode((c >> 12) | 224);
                    utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                    utftext += String.fromCharCode((c & 63) | 128);
                };

            };
            return utftext;
        },


        _utf8_decode : function (utftext) {
            var string = "";
            var i = 0;
            var c = c1 = c2 = 0;
            while ( i < utftext.length ) {
                c = utftext.charCodeAt(i);
                if (c < 128) {
                    string += String.fromCharCode(c);
                    i++;
                } else if((c > 191) && (c < 224)) {
                    c2 = utftext.charCodeAt(i+1);
                    string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                    i += 2;
                } else {
                    c2 = utftext.charCodeAt(i+1);
                    c3 = utftext.charCodeAt(i+2);
                    string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                    i += 3;
                };
            };
            return string;
        }

    };

    String.implement({
        toBase64: function(){
            return Base64.encode(this);
        },

        decodeBase64: function(){
            return Base64.decode(this);
        }
    });

})();
1 голос
/ 01 декабря 2011

Что ж, если вы используете MooTools, просто используйте Hash.Cookie, это изящно и избавит вас от головной боли, абстрагировав эту глупую вещь для хранения cookie:)

1 голос
/ 01 декабря 2011

Формат строки запроса - это хорошо, если вам легко разобрать их.

0 голосов
/ 01 декабря 2011

Если они намного больше, вы, вероятно, делаете что-то не так. setting1=blue можно представить как {"setting1":"blue"} - добавление orientation=horizontal дает {"setting1":"blue","orientation":"horizontal"} - это определенно занимает больше места в cookie, но не так много.

Кроме того, я бы лично рекомендовал не использовать JSON. Для злоумышленника с другого веб-сайта слишком просто установить cookie-файл на вашем домене, который затем может быть запущен как JSON. «Кодирование» NVP более эффективно, если вы занимаетесь только хранением ключей / значений.

0 голосов
/ 01 декабря 2011

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

Файлы cookie передаются при каждом запросе страницы. Меньше передаваемых данных почти всегда лучше.

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