jsf登录超时

GBa*_*GBa 4 jsf login viewexpiredexception

好的简单问题.我有一个JSF应用程序,包含一个登录页面.问题是如果用户加载登录页面,离开它一段时间,然后尝试登录会话过期并抛出ViewExpiredException.当发生这种情况时,我可以重定向回登录,但这不是很顺利.如何在没有额外尝试的情况下允许此流程正确登录?

mtp*_*typ 6

更新

从Mojarra 2.1.19/2.2.0开始,您现在可以将transient属性设置<f:view>为true:

<f:view transient="true">
     Your regular content
</f:view>
Run Code Online (Sandbox Code Playgroud)

你可以在 这里阅读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;
    }
}
Run Code Online (Sandbox Code Playgroud)

将"/login.xhtml"更改为您的登录页面.这将检查它是否可以恢复您的视图,如果它不能并且当前视图是您的登录页面,它将为您创建和构建视图.

在face-config.xml中设置如下:

<application>
    <!-- snip -->
    <view-handler>my.package.LoginViewHandler</view-handler>
</application>
Run Code Online (Sandbox Code Playgroud)

如果您正在使用没有Facelets的JSF(即JSP),您可以尝试让类扩展ViewHandlerWrapper - 请注意,buildView()将不可用.希望它自己的createView()会正确设置视图,但我不能100%肯定JSF/JSP.