Ответ 1
Прежде всего, я хотел бы уточнить, что JSF не совсем "идет без апатридов" в целом. JSF просто добавляет новую функцию, позволяющую разработчикам создавать запросы и формы без гражданства по требованию.
Сохранение состояния особенно полезно в динамически управляемых формах, например. условно обработанные ajax части. Он запоминает состояние формы через postbacks на основе ajax. Другими словами, это те формы, в которых вам абсолютно необходим управляемый вид bean, а не управляемый запрос bean. В случае статических форм, привязанных к области запроса bean, состояние может быть легко воссоздано по запросу на основе файла представления и, следовательно, необязательно должно быть сохранено.
Сохранение состояния имеет в случае управления сохранением состояния на стороне сервера, но стоимость с точки зрения памяти сервера и создания сеанса. Кроме того, он имеет дополнительный недостаток, заключающийся в том, что ViewExpiredException
будет возникать во время обратной передачи, когда сеанс истек. Все это можно решить, установив управление сохранением состояния на клиентскую сторону. Но это, в свою очередь, связано с пропускной способностью сети и более низкой производительностью из-за сериализации.
Например, если крупные веб-сайты охватывают раздел "общедоступный" и "ограниченный", вы хотите отложить создание сеанса до тех пор, пока пользователь не выполнит вход в систему. Однако, если у вас есть форма входа в JSF для публики часть, то сеанс все равно будет создан путем простого доступа к этой странице. Это ненужная стоимость, если форма в основном не имеет динамического состояния сама по себе и привязана к охвату запроса bean.
Правда, эта стоимость ничтожна, если у вас есть современное оборудование, но оно не является незначительным, если у вас относительно много посетителей и/или относительно плохое аппаратное обеспечение. В этом случае измерение - это знание. Кроме того, не всегда можно перейти полностью без гражданства, вы потеряете выгоду и опыт динамически управляемых представлений/форм. Тем не менее, теоретически вы можете поддерживать состояние по принципу запроса, используя скрытые поля ввода и/или параметры пользовательского запроса.
Следует отметить, что отсутствие безгражданства имеет дополнительный недостаток, что теоретически более легко выполнить атаку CSRF, если есть открытое отверстие XSS. К счастью, с JSF2/Facelets уже очень сложно иметь отверстие XSS. Единственный способ получить это - использовать <h:outputText escape="false">
для повторного отображения данных, управляемых пользователем.
См. также:
- Почему JSF сохраняет состояние компонентов пользовательского интерфейса на сервере?
- Я подвержен риску атак CSRF в форме POST, которая не требует, чтобы пользователь вошел в систему?
- Предотвращение атак CSRF, XSS и SQL в JSF
- Как разные фазы жизненного цикла JSF ведут себя в представлении без состояния, содержащем форму