В нашем проекте JSF2 на JBoss 7.1.1 мы определяем тайм-аут сеанса в web.xml
, и он отлично работает.
Однако иногда мы получаем истечение срока действия, приводя к ошибкам, подобным этому, даже если сеанс все еще жив:
javax.faces.application.ViewExpiredException: viewId:/... - View /... could
not be restored.
Где мы можем установить тайм-аут представления, как мы это делали для сеансов? Или это истечение срока действия, вызванное чем-то другим?
Ответ 1
Другая причина ViewExpiredException
заключается в том, что в сеансе создано слишком много логических представлений. Предел по умолчанию - это специфическая реализация JSF, и каждый синхронный запрос GET на конкретном представлении в основном создает новое представление. Например, когда вы используете Mojarra (который имеет предел по умолчанию 15) и запустите сеанс браузера и откройте один и тот же вид на 16 разных вкладках, а затем отправьте форму в 1-м, вы также можете получить это исключение, Предел настраивается с помощью специфического контекстного параметра реализации JSF, который com.sun.faces.numberOfLogicalViews
для Mojarra и org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION
в MyFaces (по умолчанию 20).
Это, однако, очень редкая проблема в реальном мире. Если ваш webapp действительно предназначен для использования таким образом (например, сайт социальной сети/сообщества, который приглашает к открытию на нескольких вкладках, таких как дискуссионный форум или Q & A), тогда вы можете вместо этого использовать сохранение состояния на стороне клиента.
См. также: