Сохранение данных в javascript сессии без кук
Мне никогда не нравилась реализация кук в Яваскрипте. Объем ограничен (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 — нет, поэтому их сложнее перехватить.