Переменные сессии без cookies

Небольшой JavaScript код, который позволяет хранить и использовать переменные сессии без использования cookies. Он даёт возможность хранить до 2 Мбайт данных (несоизмеримо больше допустимого объёма cookies), которые удивительно легко записывать и считывать.

Достаточно добавить файл sessvars.js (6 Кбайт) в секцию HEAD веб-страницы до скриптов, которые будут затем с ним работать:


<head>
<script type="text/javascript" src="sessionvars.js"></script>
...
</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



Много комментариев (31) к “Переменные сессии без cookies”

  1. Картинкоман :

    Вот за это огромное спасибо! Уверен, что в дальнейшем может пригодится.


  2. bb :

    Оценил. Спасибо… авось и пригодится :)
    Пиши ещё! А то чувство, что сайт покинули :’(


  3. lusever :

    С новыми вкладками, там явно проблемы. Тут могут понадобиться куки, чтобы в случае если нет window.name подгружать нужные данные.


  4. Баранов Андрей :

    про вкладки: http://www.thomasfrank.se/sessionvars.html#comment43


  5. vashurin :

    Интересная функция. Пригодится.


  6. Tengo :

    Благодарю, вещь и впрямь полезная и нужна.


  7. Луч Надежды :

    Спасиб. Познавательно.


  8. luckmus :

    Попробовал потестить, что то не работает… :(


  9. Автоград :

    я про тоже писала… сейчас переосмыслила :)


  10. antoxa :

    Ничего не понял если честно)))


  11. Мир CSS» Blog Archive » Переменные сессии без cookies :

    [...] Подробнее [...]


  12. Автомобилист :

    Спасибо! Думаю пригодится. Занес на всякий случай в букмарки пост этот.


  13. Автур :

    Спасибо за инфу, попробовал – все ок, получилось :)


  14. Дизайнер :

    Щас попробую надеюсь получется


  15. kepa :

    Полезная штука, думаю пригодится в деле


  16. Корвин :

    а как узнать кол во обьектов сохраненых в сесварс?


  17. Newlife :

    Спасибо пригодится и я думаю очень скоро ! Продолжайте в том же духе, ждемс.


  18. Алексей :

    Пригодность какая нибудь имеется?!


  19. Lexa :

    спасибо, открыл новую возможность


  20. Серегинц :

    Хм, а мне казалось что в PHP и так есть средства для работы с сессиями без куки. :)


  21. alex :

    довольно сложновато для новичка-придется матчасть подучить


  22. astyn :

    спасибо за скрипт!


  23. liza :

    Может пригодится, спосибочки


  24. Den :

    Спасиба хорошая весч.


  25. nimper79 :

    Читал много похожих статей,и большинство из них не понимал,но эта статья больше всего понятна,спасибо большое,надо попробывать на практике!


  26. Иван :

    Интересно, интересно, надо будет попробывать так сделать.


  27. Константин :

    Интересно, но зачем?

    PS: Кстати используя эту технику, мы получаем проблемы с доуступностью для пользователей PDA и прочих гаджетов.


  28. unub :

    Всегда хотел сделать авторизацию на сайте при каждом посещении и без куков


  29. Вафел :

    Щас без этого никуда(


  30. Батон :

    Применять приходится


  31. Katrinka :

    Хм… вот надо что-то написать, чувствую… но кроме эмоций нет ничего.



22 queries 0.185 seconds.