Мне никогда не нравилась реализация кук в Яваскрипте. Объем ограничен (4х20 Кб на домен), хранить возможно только в строковом типе, синтаксис для установки и получения кук избыточно сложен.

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

Поэтому я написал маленький скрипт, который позволит вам использовать переменные сессии в Яваскрипте без установки кук. Он позволяет хранить до 2 Мб данных, что намного меньше ограничивает в возможностях, чем решение на основе кук.

Вставьте sessvars.js (6 Кб) в секцию head страницы, где вы хотите задействовать переменные сессии перед другими скриптами, которые будут их использовать.

Как пользоваться


У вас теперь есть в распоряжении объект под названием sessvars. Он работает как любой другой нормальный объект в Яваскрипте — вы можете добавлять в него переменные и менять их значения. Единственное отличие заключается в том, что sessvars не исчезнет при переходе со страницы на страницу. То есть, если ваш скрипт делает что-то вроде этого:

 

sessvars.myObj = {name: «Thomas», age: 35}

 

 

на одной странице, то вы сможете получить доступ к объекту sessvars.myObj на любой другой странице, которую посетит пользователь в текущей сессии.

Попробовать пример

Методы


Единственная переменная-свойство объекта sessvars, которую вы не должны трогать, это $, потому что она содержит ряд полезных методов:

  • sessvars.$.clearMem()
    Очищает sessvars
  • sessvars.$.usedMem()
    Возвращает объем используемой памяти в килобайтах
  • sessvars.$.usedMemPercent()
    Возвращает объем используемой памяти в процентах от общего возможного объема
  • sessvars.$.debug()
    Выводит окно дебага вверху страницы (как в примере выше)
  • sessvars.$.flush()
    Явно сохраняет текущее состояние sessvars, так что все данные будут сохранены когда будет совершен переход на другую страницу. Это редко бывает необходимо, так как в нормальной ситуации это делается автоматически при событии unload.

 

Флаги


Также есть ряд различных флагов, которыми вы можете устанавливать поведение sessvars:

  • sessvars.$.prefs.memlimit
    По умолчанию — 2000
    Указывает объем данных в Кб, разрешенный для хранения в sessvars. По умолчанию 2000 Кб, так как Opera 9.25 имеет ограничение чуть выше этого числа. У остальных браузеров (IE7.0, Firefox 1.5/2.0 и Safari 3.0) ограничение намного выше — 10 Мб не представляют сложности для этих браузеров.
  • sessvars.$.prefs.autoFlush
    true/false, по умолчанию true
    Определяет, будет ли метод flush() вызываться автоматически
  • sessvars.$.prefs.crossDomain
    true/false, по умолчанию false
    Если флаг установлен в true, содержимое sessvars можно читать из разных доменов (если оба сайта используют sessvars.js).
  • sessvars.$.prefs.includeFunctions
    true/false, по умолчанию false
    Определяет, будет ли sessvars сохранять функции.
  • sessvars.$.prefs.includeProtos
    true/false, по умолчанию false
    Если true, то будут сохранены свойства, назначенные прототипам различных данных или объектов. Редко бывает необходимо.

 

Где же хранятся данные?


Принцип, лежащий в основе sessvars.js довольно прост:
Я использовал тот факт, что в яваскрипте можно устанавливать свойство window.name — это свойство обычно используется для именования окон и фреймов, чтобы можно было обращаться к ним по имени из скриптов. Чтобы не пересекаться с этим в frameset (если кто-то все еще их использует) мой скрипт использует только свойство top.name.

Замечательная особенность window.name в том, что это значение сохраняется между загрузками страниц (и даже доменов) и в том, что оно позволяет хранить очень длинные имена. Неприятная сторона в том, что свойство разрешает только строковый тип данных, поэтому я использовал JSON stringifier, чтобы сериализовывать/десериализовывать данные.

И наконец, я добавил обработчик события window unload, который убирает необходимость вручную сохранять данные каждый раз, когда вы меняете что-то в sessvars.

Вопросы безопасности


В sessvars есть флаг для использования между доменами, но хотя его значение по умолчанию равно false, он следит только за тем, что вы не получите по ошибке мусор от свойства window.name с других сайтов. На самом деле данные будут вполне доступны другим скриптам на других сайтах, и кто угодно сможет сделать javascript:alert(window.name) в адресной строке браузера.

Поэтому, пожалуйста, не храните важную информацию в sessvars, например пароли, номера кредитных кард и т.д.

Но в некоторых ситуациях sessvars безопаснее кук — содержимое кук отсылается серверу в запросе, а window.name — нет, поэтому их сложнее перехватить.