jsf登录超时



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

更新

从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。

听起来你的登录页面确实不需要在会话范围内。请求范围对于登录页面来说应该很好(因为实际上,在用户登录之前,会话中不应该有任何内容)。一旦用户登录,您可能会再次遇到这个问题,但Phill的想法从那时起就非常好。

使用jsp,您可以禁用包含此指令<%@ page session="false" %>的页面的会话。jsf肯定也有类似的东西。

两个稍显棘手的解决方案:

  • (非常黑客)每隔一段时间就会使用<meta http-equiv="refresh" content="5"/>标签自动重新加载页面
  • 使用JavaScript函数定期向服务器发送"ping"请求,以保持会话有效

我们在工作中使用IceFaces,它会自动检测您的会话何时过期,并显示一个弹出窗口提醒您注意这一事实。但由于某些原因,我们有时在登录页面上仍然会出现问题。

相关内容

  • 没有找到相关文章

最新更新