cookie - garevna/js-course GitHub Wiki

:mortar_board: Cookie

Файлы cookie позволяют идентифицировать уникальных пользователей в разных сеансах,

:warning: но не при смене браузеров или устройств

Откройте в браузере любую веб-страницу, которая сохраняет куки на клиенте и которой разрешено это делать на вашем компе

( :warning: Chrome игнорирует файлы cookie с локальных страниц )

Запустите в консоли следующий ( "многословный" ) код:

console.info ( location.href )

var res = document.cookie
    .split ( "; " )
    .map ( x =>  {
        var tmp = x.split ( "=" )
        var elem = {}
        elem [ tmp [0] ] = tmp [1]
        return elem
})
console.log ( res )

:coffee:

Вы получите массив объектов, свойства которых являются записями в cookie-файле данного сайта

Итак, свойство document.cookie возвращает строку

В этой строке можно выделить отдельные "записи", отделяемые друг от друга точкой с запятой и пробелом ( "; " )

Каждая "запись" представляет собой подстроку вида xxx=yyy, где:

 xxx - идентификатор
 yyy - значение

В нашем примере метод `document.cookie вернул строку:

"intercom-id-vuh4y50t=87110d5f-3671-4c46-bc3f-299e7e3702d8; 
_csrfToken=grvL1zeL-jpCdOS60hSAYv6EeNBy4hiICwb8"

в этой строке мы видим две подстроки, разделенных "; "

intercom-id-vuh4y50t=87110d5f-3671-4c46-bc3f-299e7e3702d8
_csrfToken=grvL1zeL-jpCdOS60hSAYv6EeNBy4hiICwb8

В первой подстроке

 ключ:      intercom-id-vuh4y50t
 значение:  87110d5f-3671-4c46-bc3f-299e7e3702d8

Во второй подстроке

 ключ:      _csrfToken
 значение:  grvL1zeL-jpCdOS60hSAYv6EeNBy4hiICwb8

Теперь изменим наш код ( и можно перейти на другую страницу ):

console.info ( location.href )

document.cookie = "userName=Ирина"

var res = document.cookie
    .split ( "; " )
    .map (
        x => Object.assign (
            {}, { [ x.split ( "=" )[0] ] : x.split ( "=" )[1] }
        )
    )

console.log ( res )

:coffee:

В результате выполнения кода

document.cookie = "userName=Irina"

в текущий файл cookie была добавлена запись

Всего в cookie-файле может храниться до 300 записей

Размер каждой записи не должен превышать 4Кбайт

Для одного домена может быть записано не более 20 файлов cookie


Можно и так:

var res = document.cookie
    .split ( "; " )
    .map ( x =>
        Object.assign (
            {},
            (
                arr => {
                    return { [ arr [0] ] : arr [1] }
                }
            ) ( x.split ( "=" )
        )
    )
)

По пунктам:

arr => { return { [ arr [0] ] : arr [1] } }

это анонимная функция, которая на входе получает массив arr и возвращает объект с одним свойством

{ [ arr [0] ] : arr [1] }

имя свойства находится в первом элементе массива ( arr [0] ),

а значение - во втором элементе массива ( arr [1] )

Эта анонимная функция используется в функциональном выражении, которое является вторым аргументом метода Object.assign

( первый аргумент - пустой массив ),

причем функциональное выражение "запускается на месте" с аргументом x.split ( " = " )

Object.assign (
    {},
    (
        arr => {
            return {
                [ arr [0] ] : arr [1]
            }
        }
    ) ( x.split ( "=" ) )
)

Вся эта конструкция вызывается в методе map


Откроем пустое окно с помощью консольной команды window.open()

В консоль нового окна вставим код:

function getCookies () {
    var res = document.cookie
        .split ( "; " )
        .map (
            x =>  {
                var tmp = x.split ( "=" )
                var elem = {}
                elem [ tmp [0] ] = tmp [1]
                return elem
            }
        )
    return Object.assign ( {}, ...res )
}

:coffee: Эта функция будет возвращать куки как объект


:mortar_board: Опция expires

При добавлении записей в куки-файл можно указывать "срок годности" записи

Для этого существует опция expires

По истечении этого срока запись будет удалена из куки-файла

Указывать срок годности нужно в формате UTC

Для преобразования даты в формат UTC нужно использовать метод toUTCString()

Если опция expires отсутствует или ее значение равно 0, то соответствующая запись в cookie-файле будет рассматриваться как сессионная и будет удалена при закрытии окна браузера

:coffee:

Например, если мы хотим, чтобы запись в куки-файле была удалена через 10 секунд после вставки,

var d = new Date (
    new Date().getTime() + 10 * 1000
).toUTCString()

и после этого добавим запись в куки-файл c указанием срока годности

и выведем в консоль содержимое куки-файла с помощью функции getCookies ():

document.cookie = "name=Ирина; expires=" + d
getCookies ()

Как видно на скриншоте, в наш куки-файл была добавлена запись

 "name=Ирина" 

По истечении 10 секунд еще раз вызовем функцию getCookies():

     getCookies ()

Вставленной нами записи уже нет


:mortar_board: UTC

Coordinated Universal Time - всемирный стандарт времени, не зависящий от временных зон

( «Скоординированное всеобщее время» )

Результат синхронизации временных шкал всемирными Центрами времени

Метод getTime() всегда возвращает время в формате UTC


:mortar_board: Удаление записей из куки-файла

Для удаления записи из куки-файла нужно "сбросить" значение "срока годности":

document.cookie = "name=; expires=" + 
    new Date ( 0 ).toUTCString ()

:warning: Важно указать идентификатор записи, значение роли не играет

Устанавливая expires записи заведомо прошедшим значением, мы вызываем удаление записи с данным идентификатором