你可以用过期的会话POST到JSF2页面吗?

时间:2012-09-25 15:39:13

标签: jsf jsf-2 viewexpiredexception

我一直在使用JSF1.2登录页面。如果用户在登录页面上停留时间太长(超时情况),然后尝试输入id和密码,则会因ViewExpired错误而失败(即使id /密码正确)。从JSF的角度来看,这一切都是有道理的。我的解决方案是简单地使用Client for javax.faces.STATE_SAVING_METHOD。但这感觉就像一个黑客。

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

我的另一个解决方案是简单地使用servlet而不是使用JSF进行登录处理。但似乎与JSF2.0的所有人都认为现在可能有一些东西可供使用。

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

3 个答案:

答案 0 :(得分:3)

create期间build返回null时,您可以手动restored viewpostback视图。您可以在自定义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了解演示文稿。

答案 1 :(得分:0)

以下是您可以使用的几个选项:

Allow user to login after session times out JSF 2.0

(如果您愿意使用PrimeFaces,他们有一个您可以使用的组件。)http://www.primefaces.org/showcase/ui/idlemonitorHome.jsf

答案 2 :(得分:0)

我没有尝试过,但我认为这实际上是新JSF功能的理想应用程序&#34;无状态视图&#34;。

设置&#34;瞬态&#34;在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升级。