В целом, веб-приложения Java EE обычно не ожидают сохранения клиентской части данных сеанса. Вы правы, чтобы беспокоиться о раздувании сеанса на стороне сервера. Общей проблемой является наличие огромных следов сеанса, которые могут вызывать значительные проблемы с ресурсами и производительностью, и могут быть особенно в кластерных средах.
Я хотел бы знать, где вы видите
Я читал, что вы можете использовать FacesContext.getExternalContext(). GetSession/getSessionMap(), который будет сохранять переменные сеанса на стороне клиента.
Я считаю (поправьте меня по этому вопросу), что это просто дает доступ к объекту HttpSession, на котором вы можете использовать тот же
session.setAttribute("myObj", myObject)
это само по себе не передает объект обратно клиент, он хранится на сервере и с помощью некоторого идентификатора сеанса, обычно передаваемого в файл cookie.
Теперь есть два других метода: вы можете явно помещать данные в файл cookie собственного производства - API-интерфейсы сервлетов, к которым вы можете получить доступ из JSF или JSP, позволят вам это сделать, или вы можете использовать скрытые поля в ваши формы и, следовательно, передавать данные сеанса aorund.
Но учтите это. Эмпирическое правило на сервере приложений, которое я использую, заключается в том, что HttpSession порядка 1k-4k обычно не является проблемой. Больше, чем это (и я видел сессии измеренных в мегабайтах), подчеркивают инфраструктуру.Если бы вас беспокоили сеансы такого размера, вы ожидали бы отправить мегабайты данных в файл cookie или скрытое поле обратно в браузер по каждому запросу? Даже 1k-2k, вероятно, немного большой.
Так рекомендации:
Держите его просто. Используйте Session API или его JSF-манифестацию.
Хранить объем данных в сеансе под контролем.
Добавлен в ответ на вопрос о кластеризации:
Как правило, в кластерной среде мы сродство к сеансу, так что запросы направляются обратно на тот же узел кластера. Однако нам все еще нужно рассмотреть случай (возможно, если члены кластера не удаются), когда запрос переходит на другой сервер.
Некоторые поставщики приложений предлагают репликацию сеанса либо посредством прямой межсерверной связи, либо путем сохранения сеанса в базе данных - очевидно, что здесь имеются накладные расходы, поэтому иногда для сеансов с низким значением мы просто принимаем потерю сеанса в событии отказа.
Существует аргумент, что если данные сеанса имеют высокое значение, то это должно быть сохранено приложением, это фактически бизнес-данные и должно рассматриваться как таковое. Для этого все чаще используются базы данных NOSQL, такие как Cloudant или MongoDb. В этом случае мы можем думать о сеансе HTTP как кэш, зная, что данные сеанса могут быть получены в случае ошибки.
Так что я бы сказал, что Корзина может иметь значительную ценность для бизнеса; он представляет клиентам продуманное накопление вещей, на которые они хотят тратить деньги. Поэтому его нужно сохранять, а не просто держать в сеансе. Как только мы решим сохранить его, мы обнаружим, что это приводит к другим интересным сценариям, таким как консолидированный опыт на многих клиентских устройствах. Клиент начинает покупки дома на настольном ПК, но завершает покупку онлайн.
Таким образом, следующий принцип:
3). Не переусердствуйте с сеансом HTTP только потому, что он есть. Рассмотрим бизнес-ценность данных и следует ли ее сохранить.
«каждый запрос создаст новый экземпляр компонента, обработанного сеансом». ЭТО ПОЛНОСТЬЮ НЕПРАВИЛЬНО –