Поэтому я написал маленький скрипт, который позволит вам использовать переменные сессии в Яваскрипте без установки кук. Он позволяет хранить до 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 — нет, поэтому их сложнее перехватить.