Вопрос по jsf-2 – Бины ViewScoped сериализуются на странице, когда включено сохранение состояния клиента?

8

Мы включили сохранение состояния клиента и используем поддерживающие компоненты ViewScoped. Когда включено сохранение состояния клиента и мы используем компонент ViewScoped, сериализуется ли компонент ViewScoped на страницу или, скажем, хранится в сеансе с токеном / ключом, который сериализуется на странице (чтобы страница могла вызывать бин из сессии, если страница отправлена обратно к себе)

Беспокойство здесь может заключаться в том, что, если он сериализован, то нам может потребоваться не хранить большие переменные экземпляра в bean-компоненте ViewScoped, поскольку он сериализуется на странице и переходит назад / вперед по сети.

Ваш Ответ

2   ответа
9

an, is the ViewScoped bean serialzied to the page or is it say, stored in session with a token/key that is serialized to the page?

Mojarra 2.x хранит вид бобов видимости в сеансе HTTP. Существует недокументированный параметр, который имеет по умолчанию максимум 25 видимых компонентов в сеансе. Смотрите такжевыпуск 4015, Другими словами, экземпляры bean-объектов в области физического представления никогда не сохраняются в состоянии представления JSF. На них ссылается только UUID, который, в свою очередь, сохраняется в состоянии просмотра JSF. Таким образом, они не сериализуются в состоянии просмотра JSF независимо от метода сохранения состояния клиент / сервер.

A concern here might be that, if it is serialized, then we might want to then worry about not storing large instance variables on the ViewScoped bean as it is serialized to the page and goes back/forth over the wire.

Это действительная проблема. Даже если бы это было правдой, мы, однако, говорим о довольно экстремальных случаях. Коллекция из 100 средних объектов с каждыми 10 средними свойствами уже должна быть не более чем на ~ 5 КБ на размер состояния просмотра. Обратите внимание, что вы можете получить большую пропускную способность, включив сжатие gzip на веб-сервере, даже до 70% для каждого текстового ресурса.

Однако если вы имеете дело с большими данными, то размер хранилища сеансов HTTP, в свою очередь, может стать проблемой. Смотрите такжеJSF 2.2. Потребление памяти. Почему Мохарра хранит в памяти объекты ViewScoped последних 25 видов? В идеале, bean-объект области видимости должен быть просто уничтожен, как только страница, на которую он ссылается, выгружается с помощью навигации GET или закрытия вкладки браузера. Компонент с областью видимости JSF по умолчанию этого не делает. Он уничтожается только во время обратной передачи в другое представление или после окончания сеанса.

В случае, если вы используете библиотеку утилит JSFOmniFaces, начиная с версии 2.2@org.omnifaces.cdi.ViewScoped поддержка разрушается во время разгрузки. Это должно оказать положительное влияние на размер хранилища HTTP-сессии.

@BalusC: просто предостережение, я считаю, что название записи JNDI меняется в зависимости от версии Mojarra. Иногда этоcom.sun.faces.ClientStateSavingPassword как вы сказали, иногда это простоClientStateSavingPassword, Я подал JIRA здесь:java.net/jira/browse/JAVASERVERFACES-1214
Спасибо - это отличная информация, чтобы знать. BestPractices
В добавление к этому хорошему ответу: вы можете дополнительно зашифровать визуализированное состояние клиента. Я думаю, что это будет даже по умолчанию в JSF 2.2
Добро пожаловать.
@Mike: на самом деле, на Мохарре от JNDIcom.sun.faces.ClientStateSavingPassword, смотрите такжеGlassfish wiki, На JSF 2.2 это частьCSRF protection by specification.
3

что ответ BalusC не относится к последним версиям JSF: для последних версий данныеjavax.faces.view.ViewScoped бобы хранятся на сервере. УвидетьJAVASERVERFACES-3090

Спасибо за заголовки, я обновил ответ.

Похожие вопросы