jsf время входа истекло

Хорошо, простой вопрос. У меня есть приложение JSF, содержащее страницу входа. Проблема в том, что пользователь загружает страницу входа в систему, оставляет ее на некоторое время, затем пытается войти в систему, истекает срок действия сеанса и генерируется исключение ViewExpiredException. Я мог бы перенаправить обратно к логину, когда это произойдет, но это не очень гладко. Как я могу позволить этому потоку правильно войти в систему без дополнительных попыток?


person GBa    schedule 23.10.2008    source источник


Ответы (4)


Обновить

Начиная с Mojarra 2.1.19 / 2.2.0, вы можете установить временный атрибут <f:view> в значение true:

<f:view transient="true">
     Your regular content
</f:view>

Вы можете прочитать об этом в блоге Balusc здесь:

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.

person mtpettyp    schedule 21.05.2009
comment
Есть идеи, как это сделать в JSF 2? - person Distortum; 22.08.2012

Похоже, ваша страница входа находится в области сеанса, хотя на самом деле это не обязательно. Область запроса должна подходить для страницы входа (поскольку реально в сеансе не должно быть ничего до того, как пользователь войдет в систему). После того, как пользователь войдет в систему, эта проблема может снова возникнуть, но идеи Филла с этого момента очень хороши.

person Ian McLaird    schedule 04.11.2008

С помощью jsp вы можете отключить сеанс для страницы, содержащей эту директиву <%@ page session="false" %>. Для jsf должно быть что-то подобное.

person Serxipc    schedule 05.11.2008

Пара слегка хакерских решений:

  • (Очень хакерский) используйте тег <meta http-equiv="refresh" content="5"/>, чтобы периодически автоматически перезагружать страницу.
  • Используйте функцию JavaScript, чтобы периодически отправлять запрос ping на сервер, чтобы поддерживать сеанс в рабочем состоянии.

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

person Community    schedule 24.10.2008