16 октября 2011 г.

Работа с cookies из Javascript

Ситуация такова, что во многих проектах приходится работать с огромным набором совершенно разнообразных данных, при этом храня какую-то их часть в Cookies, дабы каждый раз не получать заново набор из базы данных.

Могу привести самый простой пример: допустим, у нас есть страничка, на которой, с помощью таймера в яваскрипте, происходит запрос в базу данных на проверку, произошло ли какое-то событие (появилась новая запись, изменился статус флага и т.д.). Если ожидаемое действие произошло, то скрипт, допустим, показывает иконку срабатывания на странице.
Теперь, если уведомление уже показано, то совсем не нужно делать новые запросы в БД, а достаточно где-то временно хранить флаг, что иконка показана, и перед каждым новым запросом в таймере просто проверять, есть ли в куки запись о флаге. Если нет, то запрос происходит. Если есть, то его делать не нужно т.к. данные уже получены.

Сегодня мы рассмотрим возможность работы с файлами cookies из Javascript-а.
Работать с Cookies из серверного кода проще простого. Однако на поиски хоть какого-то вменяемого функционала в Javascript я потратил много времени. Но, как всегда, я нашел то, что искал, и хочу поделиться со всеми нуждающимися.

Вообщем, для работы с куки, нам достаточно всего-то 3 метода: создание, чтение, удаление.

Пойдем по-порядку:

1) Создание cookie-файла:
   1:  function createCookie(name, value, days) {
   2:      if (days) {
   3:          var date = new Date();
   4:          date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
   5:          var expires = "; expires=" + date.toGMTString();
   6:      }
   7:      else var expires = "";
   8:      document.cookie = name + "=" + value + expires + "; path=/";
   9:  }

Все довольно просто. Метод получает название будущего куки-файла, его значение, и количество дней действия.

2) Чтение cookie-файла по его имени:
   1:  function readCookie(name) {
   2:      var nameEQ = name + "=";
   3:      var ca = document.cookie.split(';');
   4:      for (var i = 0; i < ca.length; i++) {
   5:          var c = ca[i];
   6:          while (c.charAt(0) == ' ') c = c.substring(1, c.length);
   7:          if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
   8:      }
   9:      return null;
  10:  }

3) Удаление cookie-файла по его имени:
   1:  function eraseCookie(name) {
   2:      createCookie(name, "", -1);
   3:  }

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

Единственное, что хочу напомнить любителям cookie - не стоит переусердствовать в работе с ними, и самое главное - никогда, слышите, никогда не используйте куки для хранения особо важных или конфиденциальных данных!