Змінні сеансу на яваскрипті без кук

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

І більше того, браузер додає куки в заголовок запиту - а так як багато корпоративних файрволів пропускають тільки заголовки до деякого розміру, то ваші сторінки можуть взагалі не завантажитися (я бачив - це жахливо).

Тому я написав маленький скрипт, який дозволить вам використовувати змінні сесії в Яваскрипті без установки кук. Він дозволяє зберігати до 2 Мб даних, що набагато менше обмежує в можливостях, ніж рішення на основі кук.

Вставте sessvars.js (6 КБ) у секцію head сторінки, де ви хочете задіяти змінні сесії перед іншими скриптами, які будуть їх використовувати.

Як користуватися

У вас тепер є в розпорядженні об'єкт під назвою sessvars. Він працює як будь-який інший нормальний об'єкт в Яваскрипті - ви можете додавати до нього змінні і змінювати їх значення. Єдина відмінність полягає в тому, що sessvars не зникне при переході зі сторінки на сторінку. Тобто, якщо ваш скрипт робить щось на зразок цього:

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

на одній сторінці, то ви зможете отримати доступ до об'єкта sessvars.myObj на будь-якій іншій сторінці, яку відвідає користувач у поточній сесії.

Спробувати приклад

Методи

Єдина змінна-властивість об'єкта sessvars, яку ви не повинні чіпати, це $, тому що вона містить ряд корисних методів:

  • $.clearMem()

Очищає sessvars

  • $.usedMem()

Повертає об "єм у кілобайтах

  • $.usedMemPercent()

Повертає обсяг пам'яті у відсотках від загального можливого обсягу

  • $.debug()

Виводить вікно дебагу вгорі сторінки (як у прикладі вище)

  • $.flush()

Зберігає поточний стан sessvars, так що всі дані буде збережено, коли буде здійснено перехід на іншу сторінку. Це рідко буває необхідно, оскільки в нормальній ситуації це робиться автоматично при події unload.

Прапорці

Також є ряд різних прапорів, якими ви можете встановлювати поведінку sessvars:

  • $.prefs.memlimit

Типовим є 2000

Вказує обсяг даних у КБ, дозволений для зберігання в sessvars. За замовчуванням 2000 КБ, оскільки Opera 9.25 має обмеження трохи вище від цього числа. У інших браузерів (IE7.0, Firefox 1.5/2.0 і Safari 3.0) обмеження набагато вище - 10 Мб не представляють складності для цих браузерів.

  • $.prefs.autoFlush

true/false, типовий true

Визначає, чи використовуватиметься метод flush () автоматично

  • $.prefs.crossDomain

true/false, типовий false

Якщо прапор встановлено в true, вміст sessvars можна читати з різних доменів (якщо обидва сайти використовують sessvars.js).

  • $.prefs.includeFunctions

true/false, типовий false

Визначає, чи буде 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 - ні, тому їх складніше перехопити.