Мені ніколи не подобалася реалізація кук у Яваскрипті. Обсяг обмежений (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 - ні, тому їх складніше перехопити.