Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Cookie


Автор: Alx 16.4.2004, 08:34
народ, только не смейтесь, но я за всю свою жизнь ни разу не пользовался кукисами. сейчас пишу игру на JavaScript и они мне понадобились для сохранения настроек юзверя в оффлайновой весии. так что, подскажите мне просто, как имеея текстовое поле и кнопку, при слудующей загрузке странице в поле отображалось то, что юзверь туды ввел в прошлый раз перед нажатием кнопки. они должны храниться всегда. а если так нельзя, то до 2 апреля 2090 г. мне тады ровно сто лет исполниЦа!))

Автор: GoodBoy 16.4.2004, 11:08
Вот тебе простейшие функции для работы с куками:
Код
function setCookie (name, value, expires, path, domain, secure) {
   var curCookie = name + "=" + escape(value) +
       ((expires) ? ";expires=" + expires : "") +
       ((path) ? ";path=" + path : "") +
       ((domain) ? ";domain=" + domain : "") +
       ((secure) ? ";secure" : "");
   if ((escape(value)).length <= 4000) document.cookie = curCookie+";";
}

function getCookie (name) {
   var prefix = name + "=";
   var cookieStartIndex = document.cookie.indexOf(prefix);
   if (cookieStartIndex == -1) return null;
   var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length);
   if (cookieEndIndex == -1) cookieEndIndex = document.cookie.length;
   return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex));
}

function deleteCookie (name, path, domain) {
   if (getCookie(name)) {
       document.cookie = name + "=" +
       ((path) ? "; path=" + path : "") +
       ((domain) ? "; domain=" + domain : "") + "; expires=Thu, 01-Jan-99 00:00:01 GMT"
   }
}


Пользуешь так:
Код
setCookie('region', 'Russia', '+10y');
var _region = getCookie('region');
deleteCookie('region');

Автор: GoodBoy 16.4.2004, 14:17
Вообще все просто:

Цитата
Установить куку: setCookie (name, value, expires, path, domain, secure);
значения:
    name - имя куки
    value - значение
    expires - срок годности
    path - для какого каталога на сайте действительно
    domain - в каком домене работаем
    secure - секретность

Прочитать куку: value = getCookie (name);
значения:
    value - значение
    name - имя куки

Удалить куку: deleteCookie (name, path, domain)
значения:
    name - имя куки
    path - для какого каталога на сайте действительно
    domain - в каком домене работаем

Как правило параметры path, domain и secure используются редко.

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

Автор: Sardar 16.4.2004, 17:19
Весь мир юзает один и тот же код... smile.gif
Я бы изменил setCookie:
Код
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;
}

Где expires это обьект Date:
Код
dateObj = new Date(timestamp);
dateObj = new Date(year, month, date[, hours[, minutes[, seconds[,ms]]]]);

Автор: GoodBoy 2.6.2004, 10:39
Давайте тогда так:

Код
function setCookie(name, value, expiredays, path, domain, secure) {
    var todayDate = new Date();
    todayDate.setDate(todayDate.getDate() + expiredays);

    var cdata = name+"="+escape(value)+
       ((expiredays)? "; expires=" + todayDate.toGMTString() : "")+
       ((path)? "; path=" + path : "")+
       ((domain)? "; domain=" + domain : "")+
       ((secure)? "; secure" : "");
    document.cookie = cdata;
}

В качестве expiredays передается ко-во дней на которую ставим куку!

Автор: Gold Dragon 3.6.2004, 15:43
Подводя некую черту:

задание кука
Код
function qqq1(){
/*
name - имя параметра
string - строка
строка не может содержать пробел, запятую и точку с запятой
*/
document.cookie = "name=string"
}

задание кука с пробелами
Код
function qqq2(){
// задание строки
var a = "Сложный пример"
//строка не может содержать пробел, запятую и точку с запятой
// преобразование в шестнадцатиричное представление символов
var b = escape(a)
document.cookie = "name=" + b
}

задание срока годности
Код
function qqq3(){
// создание переменной Date()
var data = new Date()
// s - время в миллисекундах
// сколько 10 дней в миллисекундах
// дни * 24 ч * 60 мин * 60 с * 1000 мс
var s = 10 * 24 * 60 * 60 *1000
// установить переменную
// текущее время + продолжительность
data.setTime(data.getTime() + s)
// вычесляем время в формате GMT
var exp_v = data.toGMTString()
// устанавливаем куки с сроком годности
document.cookie = "name1=Пример1; expires=" + exp_v
}

получение простого значения
Код
function qqq4(){
// значение храниться в таком виде "name=Пример"
// получаем значение в массив
var a = document.cookie.split("=")
// a[0] = "Name"
// a[1] = "Пример"
}

задание нескольких значение
Код
function qqq5(){
// перечисляем параметры через (:)
document.cookie = "name1=Пример1:name2=Пример2:name3=Пример3"
}

чтение нескольких знечений
Код
function qqq6(){
// получаем массив типа "ИМЯ=ЗНАЧЕНИЕ"
var a = document.cookie.split(":")
// a[0] - name1=Пример1
// a[1] - name2=Пример2
// a[2] - name3=Пример3
var b = a[1].split("=")
// b[0] - name2
// b[1] - Пример2
}

удаление кука
Код
function qqq7(){
/* 
задание отрицательного знечения срока годности
удалиться параметр с именем "name"
значени "name" задавать не нужно
*/ 
document.cookie = "name=;expires=-1"
}

задание пути кука
Код
function qqq8(){
/*
на сайте есть папки
/papka1
/papka2
если страница создающая куки находиться в "/papka1"
то куки не будут видны в страницах находящихся в "papka2"
*/
document.cookie = "name=пример; path=/"
// задание корневой папки
}


задание параметра защиты
Код
function qqq9(){
/* 
значение secure булевое
если true - кук оправляется в браузер при подключение только через протокол HTTPS
если false или не указан - обычный протокол HTTP
*/
document.cookie = "name=пример; true"
}

указание домена которому назначается доступ к кукам
Код
function qqq10(){
/*
если на сервере есть узлы qqq1.lulu.ru и qqq2.lulu.ru
то кук созданный в первом не виден во втором
*/
document.cookie = "name=пример; domain=.lulu.ru"
// кук виден и там и там, точка обязательна
}


При задании имени параметра учитывайте регистр(!). Например, "name" и "Name" - это разные имена

Всё проверял (кроме domain и secure) - всё работает.

Надеюсь объяснил понятно.

Автор: Aliance 11.4.2005, 15:05
М
 

Модератор: соединил похожие темы по кукам в одну. Было много флейма, весь оффтопик поудалял или исправил, некоторые посты вывел в отдельную тему. Теперь тут осталось только описание подробной работы с файлами cookie.

Автор: Иль 18.4.2005, 23:40
Цитата(Red @ 3.6.2004, 15:43)
строка не может содержать пробел, запятую и точку с запятой

Да нет, же, строка может содержать пробел и запятую. Или это справедливо для Оперы?

Цитата(Red @ 3.6.2004, 15:43)
document.cookie = "name=;expires=-1"

В Геко так нельзя.

+ В смысле "-1"

Автор: Sardar 19.4.2005, 00:58
Иль нужно просто экранировать сторку функцией escape, ну или самодельной. Тогда хранить можно что угодно smile

Автор: Иль 19.4.2005, 01:24
Sardar, у меня сложилось ощущение, что escape много лишнего экранирует, чего не надо делать, например:
Пробел ` ~ ! @ # $ % ^ & ( ) { } [ ] ' : , / \ |

Я то использую свою функцию, но вот вдруг, например, пробелы из-за Оперы надо экранировать.
Может знаете какой подвох?

Автор: Иль 19.4.2005, 02:10
Я хотел сказать ну ненадо для Cookies енто экранировать. Или надо smile

Автор: Sardar 19.4.2005, 02:30
Для кук нужно почти всё экранировать, кроме простого текста smile Какая разница что заэкранируются допустимые символы, ну будет строка на пару байт больше, это ведь не страшно, но безглючно smile

Автор: Aliance 19.4.2005, 14:33
Цитата
Я то использую свою функцию, но вот вдруг, например, пробелы из-за Оперы надо экранировать.
Может знаете какой подвох?

Если не по теме - сильно не бейте, но пробел вроде бы можно заменить в urlе на %20

ЗЫ:
Sardar, не раскажешь о том, о чем говорил по асе - сжатие кук для увеличение дпустимого хранения. Или хотя бы ссылки :-)

Автор: Aliance 4.5.2005, 18:21
http://forum.vingrad.ru/index.php?showtopic=17865

Автор: fregs 5.7.2005, 09:21
в сообщении GoodBoy от 2.6.2004, 10:39 очепятка с именем переменной expiredays(expires)

правильно так
Код

function setCookie(name, value, expiredays, path, domain, secure) {
   var todayDate = new Date();
   todayDate.setDate(todayDate.getDate() + expiredays);

   var cdata = name+"="+escape(value)+
      ((expiredays)? "; expires=" + todayDate.toGMTString() : "")+
      ((path)? "; path=" + path : "")+
      ((domain)? "; domain=" + domain : "")+
      ((secure)? "; secure" : "");
   document.cookie = cdata;
}


2 модераторам
почистить бы топик, лишнего много

М
 
Посмотрел, лишнего нет, относиться к кукам. Код стоит в первых постах. Аргументируй предложение :)

2Сардар: это потому, что я уже все подчистил :)

Автор: fregs 6.7.2005, 10:09
добавлю 2 полезных ссылочки по кукам c сайта Пирамидыча
http://pyramidin.narod.ru/jscript/clientref13/cookies.htm#1002170
http://pyramidin.narod.ru/jscript/clientref13/document.htm#1193577

2 Mодер:
ну посты про сжатие то ты удалил...

Автор: Aliance 6.7.2005, 10:43
Не удалил, а разделил: http://forum.vingrad.ru/index.php?showtopic=57627

Автор: Alix36 15.1.2007, 14:03
может кто обьяснить 
secure параметр функции создания кукисов
какое значение должна нести, и как она защищает куки, насколько это разумно (КПД(Отношение полезности к времени торможения=)))

Добавлено @ 14:08 
а,  и  Gold Dragon писал функции по видимому, встроенные, это что заменители рукописных функций 
тут?
http://forum.vingrad.ru/index.php?showtopic=23902&view=findpost&p=145585

Автор: GZep 21.1.2007, 21:07
Цитата(Alix36 @  15.1.2007,  14:03 Найти цитируемый пост)
какое значение должна нести

Булевое, т.е. true или false.

Добавлено @ 21:08 
Короче, вот:
Код

setCookie( name [STRING], value [STRING], expires [INTEGER], path [STRING], domain [STRING], secure [BOOLEAN] )

Автор: GZep 22.1.2007, 15:52
Вопрос:
А можно ли сделать вот так?
Код

function setCookie(name, value, expiredays, path, domain, secure) {
    //бла-бла, добавляем значение...
    return true;
}

Короче, можно ли сделать чтобы функция возвращала в случае успеха true, иначе false?

Автор: Sardar 22.1.2007, 20:20
GZep, ты шутишь или действительно не можешь после document.cookie = .... поставить  return true;smile 
Считаю такие посты накруткой счётчика, первое предупреждение  smile 

Автор: GZep 23.1.2007, 14:04
Sardar, не просто true надо сделать чтобы ф-ция возвращала, а надо сделать чтобы в случае неудачи было false.
Вот, например:
Код

function setCookie(name, value, expires, path, domain, secure) {
    var curCookie = name + "=" + escape(value);
    if (expires)
        curCookie += ";expires=" + expires;
    if (path)
        curCookie += ";path=" + path;
    if (domain)
        curCookie += ";domain=" + domain;
    if (secure)
        curCookie += ";secure";
    if ((escape(value)).length <= 4000)
        document.cookie = curCookie + ";";
    //Вот с этого места самое интересное
    if (getCookie(name))
        return true;
    else
        return false;
}

Ну, тут проверяется только имя, а можно, например чтобы все проверялось. Sardar, как вы думаете, это вообще будет нести хоть какую-нибудь пользу.

Цитата(Sardar @  22.1.2007,  20:20 Найти цитируемый пост)
накруткой счётчика

Бред. Если бы это было надо, то я бы в флейме это делал. Я, что, создаю такое впечатление? smile 

Автор: Sardar 23.1.2007, 17:20
Цитата(GZep @  23.1.2007,  13:04 Найти цитируемый пост)
Я, что, создаю такое впечатление?

Спрашивая элементарные вещи, которые способен сделать даже начинающий со стажем в пол часа... да, такое впечатление создаёшь smile

Проверка только по getCookie не корректна, т.к. если кука существовала раньше, а нынешняя превышает лимит в 4к, то функция возвратит true, хотя кука не менялась. Можно и так:
Код
if ((escape(value)).length <= 4000)
        document.cookie = curCookie + ";";
        return getCookie(name) != null;
}
return false;

//краткое (читатй для извращенцев)
//return ((escape(value)).length <= 4000? ((document.cookie = curCookie + ";"), getCookie(name) != null): false;


Цитата(GZep @  23.1.2007,  13:04 Найти цитируемый пост)
это вообще будет нести хоть какую-нибудь пользу

Привычка доверять window.navigator.cookieEnabled. Хотя может стоять  браузере какой плагин, режущий куки, так что в корректном коде проверку делать всё же стоит.

Автор: Alx 30.3.2007, 00:17
оффтоп: а в IPB как сесссия без куков держится? там же вроде должен логин и хэш пароля передаваться? или меня снова глючит?

Автор: Alca 3.9.2008, 10:51
http://ru.wikipedia.org/wiki/HTTP-Cookie#.D0.9D.D0.B0.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D0.B5

Автор: Се ля ви 24.9.2008, 12:02
Есть ещё расширения кук. Например http://msdn.microsoft.com/en-us/library/ms533046.aspx:
Цитата
If the HttpOnly attribute is included in the response header, the cookie is still sent when the user browses to a Web site in the valid domain. The cookie cannot be accessed through script in Internet Explorer 6 SP1, even by the Web site that set the cookie in the first place. This means that even if a cross-site scripting bug exists, and the user is tricked into clicking a link that exploits this bug, Windows Internet Explorer does not send the cookie to a third party. The information is safe.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)