Переменные сессии без cookies
14.05.2024Небольшой JavaScript код, который позволяет хранить и использовать переменные сессии без использования cookies. Он даёт возможность хранить до 2 Мбайт данных (несоизмеримо больше допустимого объёма cookies), которые удивительно легко записывать и считывать.
Достаточно добавить файл sessvars.js (6 Кбайт) в секцию HEAD
веб-страницы до скриптов, которые будут затем с ним работать:
...
Как это использовать
Теперь у вас есть доступ к объекту sessvars. Он работает так же, как любой нормальный JavaScript объект — вы можете добавлять к нему новые свойства и изменять значения уже заданным. Единственная разница состоит в том, что sessvars будет доступен на различных страницах вашего сайта. Теперь, если вы в своём скрипте напишете нечто вроде:
sessvars.myObj = {name: "Thomas", age: 35}
на одной веб-странице — вы сможете получить доступ к объекту sessvars.myObj на всех других страницах, по которым пользователь перемещается во время одной сессии.
Методы
Еднственное свойство sessvars, в которое не следует вмешиваться это $, потому что в нём хранятся несколько полезных методов.
sessvars.$.clearMem()
Очищает память sessvars.
sessvars.$.usedMem()
Возвращает количество памяти, используемой sessvars в килобайтах.
sessvars.$.usedMemPercent()
Возвращает количество памяти, используемой sessvars в процентах от доступной.
sessvars.$.debug()
Выводит окно отладчика вверху веб-страницы.
sessvars.$.flush()
Явно сохраняет текущее состояние sessvars перед переходом на другие страницы. Это редко требуется, потому что сохранение происходит автоматически при возникновении сообытия unload.
Настройки
Несколько различных флагов, регулирующих поведение sessvars, которые можно установить:
sessvars.$.prefs.memlimit
[2000 {
по умолчанию}]
Сколько килобайт данных, вы можете хранить в sessvars. По умолчанию: 2000 килобайт, потому что Опера 9,25 поддерживает чуть больше этого. IE7.0, Firefox 1.5/2.0 и Safari 3,0 позволяют больше — 10 MB не является проблемой для этих браузеров.
sessvars.$.prefs.autoFlush
[true {
по умолчанию} /false]
Включает/выключает автоматическое сохранение (см. методы).
sessvars.$.prefs.crossDomain
[true/false {
по умолчанию} ]
Если этот флаг установлен, содержимое sessvars можно читать на разных доменах (если оба сайта используют sessvars.js).
sessvars.$.prefs.includeFunctions
[true/false {
по умолчанию} ]
Разрешает передачу функций, сохранённых в sessvars.
sessvars.$.prefs.includeProtos
[true/false {
по умолчанию} ]
Если этот флаг установлен true, sessvars сохраняет свойства установленные прототипам различных типов данных/объектов между страницами. Редко требуется.
За кадром: каким образом хранятся данные?
Принципы, лежащие в основе sessvars.js на самом деле довольно просты:
C помощью JavaScript вы можете устанавливать свойство window.name
, которое используется при обозначении окон и фреймов для обращения к ним из скриптов.
Замечательная особенность window.name
заключается в том, что это свойство сохраняется при перемещении по страницам (даже по разным доменам) и может хранить очень длинное значение. Недостаток в том, что это значение может быть только строкой. Чтобы обойти это, используется JSON stringifier для сериализации/де-сериализации объекта данных, таким образом, появляется возможность упаковки/распаковки передаваемого содержимого.
Обработчик события window unload избавляет от необходимости ручного пересохранения передаваемых данных при каждом изменении содержимого sessvars.
Соображения безопасности.
Флаг crossDomain по умолчанию выключен, однако это означает лишь то, что вы не испортите содержимое вашего sessvars в window.name
на других сайтах по ошибке. Фактические данные, которые вы указали будут доступны для просмотра и для других скриптов на других доменах, а также их можно увидеть, если набрать javascript: alert(window.name) в адресной строке браузера.
Поэтому не следует хранить секретную информацию в sessvars, например, пароли, номера кредитных карт и т.п.
Но в некоторых аспектах sessvars.js безопаснее, чем cookies: cодержимое window.name не отправляется на сервер в заголовке запроса, как это происходит с содержимым cookie, поэтому оно не может быть перехвачено.
Thomas Frank, Session variables without cookies
Вот за это огромное спасибо! Уверен, что в дальнейшем может пригодится.
2008-05-14 at 2:31 am
Оценил. Спасибо… авось и пригодится :)
Пиши ещё! А то чувство, что сайт покинули :’(
2008-05-14 at 10:06 am
С новыми вкладками, там явно проблемы. Тут могут понадобиться куки, чтобы в случае если нет window.name подгружать нужные данные.
2008-05-14 at 11:56 am
про вкладки: http://thomasfrank.se/sessionvars.html#comment43
2008-05-14 at 12:22 pm
?нтересная функция. Пригодится.
2008-05-15 at 9:22 am
Благодарю, вещь и впрямь полезная и нужна.
2008-05-18 at 2:18 pm
Спасиб. Познавательно.
2008-05-19 at 1:24 pm
Попробовал потестить, что то не работает… :(
2008-05-20 at 10:28 pm
я про тоже писала… сейчас переосмыслила :)
2008-05-21 at 4:56 pm
Ничего не понял если честно)))
2008-06-01 at 12:26 am
[...] Подробнее [...]
2008-06-04 at 2:36 pm
Спасибо! Думаю пригодится. Занес на всякий случай в букмарки пост этот.
2008-06-07 at 11:40 am
Спасибо за инфу, попробовал – все ок, получилось :)
2008-06-13 at 8:33 am
Щас попробую надеюсь получется
2008-06-16 at 3:38 pm
Полезная штука, думаю пригодится в деле
2008-06-24 at 10:34 pm
а как узнать кол во обьектов сохраненых в сесварс?
2008-06-25 at 11:01 am
Спасибо пригодится и я думаю очень скоро ! Продолжайте в том же духе, ждемс.
2008-07-11 at 10:26 pm
Пригодность какая нибудь имеется?!
2008-07-22 at 12:21 pm
спасибо, открыл новую возможность
2008-08-08 at 4:31 pm
Хм, а мне казалось что в PHP и так есть средства для работы с сессиями без куки. :)
2008-08-23 at 7:37 pm
довольно сложновато для новичка-придется матчасть подучить
2008-08-27 at 9:39 pm
спасибо за скрипт!
2008-08-29 at 12:13 pm
Может пригодится, спосибочки
2008-08-29 at 7:20 pm
Спасиба хорошая весч.
2008-08-29 at 7:32 pm
Читал много похожих статей,и большинство из них не понимал,но эта статья больше всего понятна,спасибо большое,надо попробывать на практике!
2008-09-01 at 6:47 pm
?нтересно, интересно, надо будет попробывать так сделать.
2008-09-02 at 1:18 pm
?нтересно, но зачем?
PS: Кстати используя эту технику, мы получаем проблемы с доуступностью для пользователей PDA и прочих гаджетов.
2008-09-05 at 2:33 pm
Всегда хотел сделать авторизацию на сайте при каждом посещении и без куков
2008-09-09 at 1:42 am
Щас без этого никуда(
2008-09-11 at 8:51 pm
Применять приходится
2008-09-11 at 8:52 pm
Хм… вот надо что-то написать, чувствую… но кроме эмоций нет ничего.
2008-09-18 at 2:50 pm