2012-09-25 21 views
3

我一直在使用JSF1.2来登录页面。如果用户在登录页面上驻留的时间太长(超时位置),然后尝试输入ID和密码,它将失败,并出现ViewExpired错误(即使ID /密码正确)。从JSF的角度来看,这一切都是有道理的。我的解决方案是使用Client for javax.faces.STATE_SAVING_METHOD。但是这感觉就像一个黑客。你可以通过过期的会话发布到JSF2页面吗?

我的应用正在迁移到JSF2.0。我希望我的应用程序返回到STATE_SAVING_METHOD的服务器。但我的要求是,如果提交的适当的ID和密码,该应用程序将接受它。

我的其他解决方案是简单地使用servlet,而不是使用JSF进行登录处理。但是对于JSF2.0的所有微软来说,似乎现在可能有些东西可用。

任何想法将不胜感激。 谢谢。

回答

3

您可以手动createbuild视图时restored view返回时postbacknull。您可以在自定义ViewHandler中执行此操作。这里有一个开球例如:

public class RestorableViewHandler extends ViewHandlerWrapper { 

    private ViewHandler wrapped; 

    public RestorableViewHandler(ViewHandler wrapped) { 
     this.wrapped = wrapped; 
    } 

    @Override 
    public UIViewRoot restoreView(FacesContext context, String viewId) { 
     UIViewRoot restoredView = wrapped.restoreView(context, viewId); 

     if (!(restoredView == null && context.isPostback())) { 
      return restoredView; 
     } 

     UIViewRoot createdView = createView(context, viewId); 
     context.setViewRoot(createdView); 

     try { 
      getViewDeclarationLanguage(context, viewId).buildView(context, createdView); 
     } catch (IOException e) { 
      throw new FacesException(e); 
     } 

     return createdView; 
    } 

    @Override 
    public ViewHandler getWrapped() { 
     return wrapped; 
    } 

} 

您可能希望用支票延长if检查,如果viewId代表登录页面。

得到它的运行,如faces-config.xml如下注册它:

<application> 
    <view-handler>com.example.RestorableViewHandler</view-handler> 
</application> 

然而有技术限制:该重建的观点是,正是因为它是最初请求期间一样,所以任何修改此后,由标记处理程序或基于某些视图或甚至会话作用域变量的有条件呈现组件完成的JSF组件树完全丢失。为了重新创建所需的视图,您需要确保这些修改是基于请求范围变量(读取:请求参数)而不是视图或会话范围变量进行的。

换句话说,视图的状态不应该依赖于视图或会话作用域托管的bean,而应该仅仅依赖于请求作用域的托管bean。


更新:所述OmniFaces JSF工具库具有在当前1.3快照中的<o:enableRestorableView>风味可以嵌入在一个<f:metadata>可重复使用的解决方案。演示请参阅<o:enableRestorableView> showcase page on snapshot site

0

我没试过它,但我认为这实际上是新的JSF特性“无状态视图”的理想应用。

只需设置 “短暂” 的JSF视图:

<f:view transient="true"> 
    ...content... 
</f:view> 

一个很好的解释是在这里:

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

也看到了这个问题:What is the usefulness of statelessness in JSF?

不幸的是,这个功能仅在Mojarra V2.1(和MyFaces 2.2)中可用,因此您可能需要从2.0升级。

相关问题