Избегайте ViewExpiredException в JSF 1.2 на одной странице

У меня есть страница входа, которая не защищена и доступна через разные варианты навигации.

Проблема: многие пользователи получают доступ к этой странице входа и оставляют ее открытой на некоторое время, прежде чем снова войти в систему. Бум! Возникает ужасное ViewExpiredException! Я хотел бы избежать ViewExpiredException, чтобы они все равно снова вошли в систему. Мне не нужен обходной путь для всех представлений, а только для входа на страницу.

Я не могу перейти на JSF2 (по бюджетным соображениям).

У меня есть эта конфигурация:

javax.faces.STATE_SAVING_METHOD = server

что я не могу изменить (у нас ограниченная полоса пропускания и механизмы, которые блокируют HTTP-запросы больше, чем небольшая страница формы с очень ограниченными полями ввода.

Любая идея?


person pmartin8    schedule 04.03.2016    source источник
comment
Если вы используете Mojarra (не MyFaces), вы можете настроить его только для всего приложения (а не для отдельной страницы), установив для параметра контекста com.sun.faces.enableRestoreView11Compatibility значение true. Это приемлемо?   -  person BalusC    schedule 04.03.2016
comment
Хорошо, может быть! Что произойдет на других страницах, когда срок действия просмотра истечет? Получу ли я какой-нибудь опыт «WTF», как вы сказали в предыдущем посте?   -  person pmartin8    schedule 04.03.2016
comment
Только если вы полагаетесь на состояние области представления, но в JSF 1.x область представления уже не существует как область управляемого компонента. Если вы используете что-то вроде ‹t:saveState› Tomahawk для имитации области представления JSF 2.x, то это может закончиться опытом WTF, потому что bean-компонент, на который ссылается ‹t:saveState›, будет реконструирован с нуля, а не повторно использован при срок действия представления истекает (поэтому вместо страницы с ошибкой вы получаете новый новый компонент)   -  person BalusC    schedule 04.03.2016
comment
Хорошо, забавная вещь с enableRestoreView11Compatibility заключается в том, что он повторно отображает страницу входа вместо того, чтобы следовать правилу навигации, определенному в моем приложении. Итак, я снова оказываюсь на своей странице входа ... но без ViewExpiredException :(   -  person pmartin8    schedule 04.03.2016
comment
JSF 1.2 был выпущен давным-давно, поэтому я могу не помнить некоторые вещи правильно, но теоретическая причина может заключаться в том, что перестроенное представление не соответствует представленному представлению. Попробуйте присвоить компонентам формы, ввода и кнопки фиксированный идентификатор, если это еще не сделано.   -  person BalusC    schedule 04.03.2016
comment
Копаясь в старом коде JSF, я вижу, что при восстановлении представления способ JSF 1.1 переходит прямо к рендерингу ответа (он помечает ответ как подлежащий рендерингу). Затем он отображает viewId, включенный в контекст (который в данном случае является моей страницей входа). Он не перейдет к фазе вызова приложения. Может быть, я должен добавить слушателя после фазы, чтобы взломать это?!   -  person pmartin8    schedule 04.03.2016
comment
Хм. Другой способ — оставить его и использовать простую HTML-форму в сочетании с простым сервлетом.   -  person BalusC    schedule 04.03.2016


Ответы (1)


Я не мог вывести свою страницу входа из контекста JSF, потому что на моей странице входа есть целый ряд поведений, которые зависят от контекста JSF.

Наконец-то я решил проблему с грязным хаком. В прослушивателе RestoreViewPhase я обнаружил, что срок действия текущего представления истек, и я получаю все параметры из HTTP-запроса в управляемый сеансом компонент.

Затем, когда я возвращаюсь на страницу входа, какой-то javascript автоматически повторно отправляет форму вместе с новым представлением.

Довольно хакерский, но он работает.

person pmartin8    schedule 08.03.2016