Pergunta

pergunta simples Ok. Tenho uma aplicação JSF, contendo uma página de login. O problema é se o usuário carrega a página de login, folhas por um tempo, em seguida, tenta iniciar sessão a expirar sessão e um ViewExpiredException é lançada. Eu poderia redirecionar de volta para o login quando isso acontece, mas isso não é muito bom. Como posso permitir que esse fluxo para adequadamente login sem uma tentativa adicional?

Foi útil?

Solução

Atualizar

A partir de Mojarra 2.1.19 / 2.2.0 agora você pode definir o atributo transitória do <f:view> como true:

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

Você pode ler sobre em on Balusc de blogue aqui:

http://balusc.blogspot.com.br/2013 /02/stateless-jsf.html

Original

Se você estiver usando Facelets que você pode criar seu próprio ViewHandler de lidar com isso:

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;
    }
}

Change "/login.xhtml" para a página de login. Isto verifica para ver se ele pode restaurar o seu ponto de vista, e se não pode e a visão atual é a sua página de login que irá criar e construir o ponto de vista para você.

Set disto em sua cara-config.xml como segue:

<application>
    <!-- snip -->
    <view-handler>my.package.LoginViewHandler</view-handler>
</application>

Se você estiver usando JSF sem Facelets (ou seja JSPs), você pode tentar ter a classe estender ViewHandlerWrapper - nota que buildView () não estará disponível. Esperemos CreateView () em seu próprio irá definir a visão corretamente, mas eu não estou 100% certo com JSF / JSP.

Outras dicas

Parece que a sua página de login é no escopo de sessão, quando ele realmente não precisa ser. Pedido do escopo deve estar bem para uma página de login (uma vez que, realisticamente, não deve haver qualquer coisa na sessão antes de o usuário efetuar login). Uma vez que o usuário fizer login, você pode ter essa cultura questão back up, mas as ideias de Phill são muito bons a partir daí.

Com jsp você pode desativar a sessão para uma página incluindo este <%@ page session="false" %> directiva. Deve haver algo semelhante para jsf.

Os pares de soluções ligeiramente hacky:

  • (Very hacky) usar um tag <meta http-equiv="refresh" content="5"/> para recarregar automaticamente a página de vez em quando.
  • Use uma função JavaScript para enviar periodicamente um 'ping' pedido para o servidor para manter a sessão viva.

IceFaces no trabalho que detecta automaticamente quando a sua sessão expirou e exibe um pop-up alertando ao fato. Mas nós ainda às vezes têm problemas na página de login por algum motivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top