Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Понимание Cookies, у нас одна или много куков? 
V
    Опции темы
Се ля ви
Дата 8.5.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



В закреплённой теме про Cookies много по технологии, но мало о понимании того, как следует работать с куками.

Что такое - кука? По сути это - строчка вида "имя=значение" плюс срок жизни и адрес с доменом привязки (ну и ещё можно флажок "secure" поставить, но это уже детали).

Свойство "document.cookie" возвращает строку. Просто одну строку. Т.е. служебные заголовки имеют специальное значение, а в остальном подобны тем же парам "имя=значение" (это: "expires", "path", "domain" и "secure" - последний, правда, значения не имеет).

Вот и функция, которую любезно переработал Sardar:
Код
function setCookie(name, value, expires, path, domain, secure) {

    var cdata = name + "=" + escape(value)+
                (expires ? "; expires=" + expires.toGMTString() : "") +
                (path    ? "; path=" + path : "") +
                (domain  ? "; domain=" + domain : "") +
                (secure  ? "; secure" : "");

    document.cookie = cdata;
}


Легко понять, что она написана для одной единственной куки.

А если мы захотим поставить несколько разных куков?

Пока срок жизни и привязка у всех из них совпадают, всё ещё более или менее нормально - мы просто перечисляем их, а потом идёт служебная информация, общая для всех:

Код
function setCookie(name, value, expires, path, domain, secure) {
    
    var cdata = "";
    for (var i = 0; i < name.length, i++)
        cdata += (i > 0 ?  "; " : "") + name[i] + "=" + escape(value[i]);
    
    cdata += ((expires)? "; expires=" + expires.toGMTString() : "") +
             ((path)? "; path=" + path : "") +
             ((domain)? "; domain=" + domain : "") +
             ((secure)? "; secure" : "");
    
    document.cookie = cdata;
}


Ну, или более логичный вариант:
Код
function setCookie(cookiesMap, expires, path, domain, secure) {
    
    var cdata = "",
          beginFlag = true;

    for (var name in cookiesMap) {
        cdata += (beginFlag ? "" : "; ") + name + "=" + escape(cookiesMap[name]);
        beginFlag = false;
    }
    
    cdata += ((expires)? "; expires=" + expires.toGMTString() : "") +
             ((path)? "; path=" + path : "") +
             ((domain)? "; domain=" + domain : "") +
             ((secure)? "; secure" : "");
    
    document.cookie = cdata;
}


Но что, если мы хотим поместить куки с разной служебной информацией? Например, если одну пару ключ-значение я хочу поместить клиенту на месяц, а другую - на год, как мне это сделать? Или путь поставить более общий для одной куки и частный - для другой, что бы одна была доступна везде в домене, а вторая - только на страницах данного подраздела?

Это сообщение отредактировал(а) Се ля ви - 8.5.2007, 15:07


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Sardar
Дата 8.5.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Се ля ви @  8.5.2007,  13:48 Найти цитируемый пост)
ну и ещё можно флажок "secure" поставить, но это уже детали

Ну это не просто детали, флажок запрещает отсылать куку если соединение не секурное (секурное например через SSL(https)).

Просто задавай по одной паре значений за раз с собственными параметрами.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
vasac
Дата 8.5.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



В большинстве случаев куки ставятся на весь сайт. Отсюда, кстати, у многих новичков, которые не задумываются над параметром path бывают проблемы. Имхо, лучше по умолчанию сделать path=/
PM WWW   Вверх
Се ля ви
Дата 9.5.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



Цитата(Sardar @  8.5.2007,  20:48 Найти цитируемый пост)
Просто задавай по одной паре значений за раз с собственными параметрами.

За раз - т.е. на каждую загрузку страницы?

Цитата(vasac @  8.5.2007,  22:46 Найти цитируемый пост)
В большинстве случаев куки ставятся на весь сайт. Отсюда, кстати, у многих новичков, которые не задумываются над параметром path бывают проблемы. Имхо, лучше по умолчанию сделать path=/ 


Да, параметры по-умолчанию надо бы подработать. Например, так:
Код
function setCookie(cookiesMap, expires, path, domain, secure) {
    
    var cdata = "",
          beginFlag = true;
    for (var name in cookiesMap) {
        cdata += (beginFlag ? "" : "; ") + name + "=" + escape(cookiesMap[name]);
        beginFlag = false;
    }
    
    cdata += ((expires)? "; expires=" + expires.toGMTString() : "") +
             ((path)? "; path=" + path : "; path=/") +
             ((domain)? "; domain=" + domain : "") +
             ((secure)? "; secure" : "");
    
    document.cookie = cdata;
}



--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Sardar
Дата 9.5.2007, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Се ля ви @  9.5.2007,  18:30 Найти цитируемый пост)
т.е. на каждую загрузку страницы?

Не понял... судя по первому посту ты хочешь поставить более одной куки с разными параметрами. Тогда просто ставь их скриптом в одной загрузке страницы вызывая setCookie несколько раз, задавая для каждой куки свои параметры. Или ты имел в виду что то другое?


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Се ля ви
Дата 10.5.2007, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



Цитата(Sardar @  9.5.2007,  22:50 Найти цитируемый пост)
Не понял... судя по первому посту ты хочешь поставить более одной куки с разными параметрами. Тогда просто ставь их скриптом в одной загрузке страницы вызывая setCookie несколько раз, задавая для каждой куки свои параметры. Или ты имел в виду что то другое? 

Именно это. Хочешь сказать, что свойство document.cookie от этого не затрётся, а все значения будут напластовываться друг на друга? Т.е. мы присваиванием 
Код
document.cookie = cdata;
 не стираем предыдущих куков?


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Sardar
Дата 10.5.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Се ля ви @  10.5.2007,  00:22 Найти цитируемый пост)
 не стираем предыдущих куков?

Да. document.cookie вещь интересная, возвращает список всех кук, а при записи добавляет куки. Удалить куку можно только заново её поставив с пустым значением или вытекшем временем. Повторить такое для своих объектов можно только в мозиллоподобных, т.к. поддерживаются не ECMA стандатные __defineGetter__ и __defineSetter__.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Се ля ви
Дата 11.5.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



Цитата(Sardar @  10.5.2007,  12:02 Найти цитируемый пост)
document.cookie вещь интересная, возвращает список всех кук, а при записи добавляет куки.

Интересно... Ну хорошо - а как document.cookie тогда возвращает несколько кук с разными параметрами - у него после каждой пары "имя=значение" перечисляются все служебные данные для неё?


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
ksnk
Дата 11.5.2007, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Нет. С точки зрения броузеров - это пары ИМЯ=ЗНАЧЕНИЕ, разделенные ; Служебные данные imho, не извлечь.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Се ля ви
Дата 11.5.2007, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



Цитата(ksnk @  11.5.2007,  16:09 Найти цитируемый пост)
С точки зрения броузеров - это пары ИМЯ=ЗНАЧЕНИЕ, разделенные ;

Мда... достаточно в коммандной строке браузера набрать "javascript:alert(document.cookie);" и получим подтверждение - там выдаются только исключительно информативные пары...

Может, есть какие-то специальные средства расширения у конкретных браузеров, которые выдают JavaScript`у эту информацию?


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1627 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.