время входа в jsf истекло
-
04-07-2019 - |
Вопрос
Хорошо, простой вопрос.У меня есть приложение JSF, содержащее страницу входа.Проблема в том, что если пользователь загружает страницу входа, оставляет ее на некоторое время, а затем пытается войти в систему, срок действия сеанса истекает и выдается исключение ViewExpiredException.Когда это произойдет, я мог бы перенаправить обратно на вход в систему, но это не очень гладко.Как я могу разрешить этому потоку правильно войти в систему без дополнительной попытки?
Решение
Обновлять
Начиная с Mojarra 2.1.19/2.2.0, теперь вы можете установить временный атрибут <f:view>
к истине:
<f:view transient="true">
Your regular content
</f:view>
Вы можете прочитать об этом в Балуска блог здесь:
http://balusc.blogspot.com.br/2013/02/stateless-jsf.html
Оригинал
Если вы используете Facelets, вы можете создать свой собственный ViewHandler для решения этой проблемы:
public class LoginViewHandler extends FaceletViewHandler
{
public LoginViewHandler( ViewHandler viewHandler )
{
super( viewHandler );
}
@Override
public UIViewRoot restoreView( FacesContext ctx, String viewId )
{
UIViewRoot viewRoot = super.restoreView( ctx, viewId );
if ( viewRoot == null && viewId.equals( "/login.xhtml" ) )
{
// Work around Facelet issue
initialize( ctx );
viewRoot = super.createView( ctx, viewId );
ctx.setViewRoot( viewRoot );
try
{
buildView( ctx, viewRoot );
}
catch ( IOException e )
{
log.log( Level.SEVERE, "Error building view", e );
}
}
return viewRoot;
}
}
Измените «/login.xhtml» на свою страницу входа.Это проверяет, может ли оно восстановить ваше представление, и если оно не может и текущее представление является вашей страницей входа в систему, оно создаст и построит представление для вас.
Установите это в вашем face-config.xml следующим образом:
<application>
<!-- snip -->
<view-handler>my.package.LoginViewHandler</view-handler>
</application>
Если вы используете JSF без Facelets (т.JSP) вы можете попробовать расширить класс ViewHandlerWrapper — обратите внимание, что buildView() будет недоступен.Надеюсь, что createView() сам по себе настроит представление правильно, но я не уверен на 100% в JSF/JSP.
Другие советы
Похоже, ваша страница входа в систему находится в области видимости сеанса, хотя в действительности это не нужно. Область запроса должна быть в порядке для страницы входа в систему (поскольку в действительности не должно быть ничего в сеансе до входа пользователя в систему). Когда пользователь войдет в систему, эта проблема может снова появиться, но идеи Фила с этого момента очень хороши.
С помощью jsp вы можете отключить сеанс для страницы, включающей эту директиву <%@ page session="false" %>
. Должно быть что-то похожее для jsf.
Пара немного хакерских решений:
- (Очень хакерски) используйте
<meta http-equiv="refresh" content="5"/>
тег для автоматической перезагрузки страницы время от времени. - Используйте функцию JavaScript для периодической отправки запроса «ping» на сервер, чтобы поддерживать сеанс.
Мы используем Ледовые лица на работе, который автоматически определяет, когда срок вашего сеанса истек, и отображает всплывающее окно, предупреждающее вас об этом.Но по какой-то причине у нас все еще иногда возникают проблемы на странице входа в систему.