4

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

4

4 回答 4

6

更新

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

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

于 2009-05-21T19:53:51.963 回答
0

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

于 2008-11-04T18:09:28.307 回答
0

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

于 2008-11-05T17:15:28.493 回答
-1

几个有点hacky的解决方案:

  • (非常hacky)使用<meta http-equiv="refresh" content="5"/>标签每隔一段时间自动重新加载页面。
  • 使用 JavaScript 函数定期向服务器发送“ping”请求以保持会话处于活动状态。

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

于 2008-10-24T08:27:28.983 回答