-->

你可以张贴到JSF2页面,在会话过期?(Can you POST to JSF2 page with

2019-07-31 22:06发布

我一直在使用JSF1.2的登录页面。 如果用户坐太久(超时situatation)在登录页面,然后尝试进入失败与错误ViewExpired ID和密码(即使ID /密码是正确的)。 这一切都使得从JSF透视感觉给我。 我的解决方案是简单地使用客户端javax.faces.STATE_SAVING_METHOD。 但是,这感觉就像一个黑客攻击。

我的应用程序迁移到JSF2.0。 我想我的应用程序返回到服务器STATE_SAVING_METHOD。 但我的要求是,如果正确的ID和密码提交的应用程序会接受它。

我的另一个解决方案是简单地使用servlet,而不是使用JSF用于登录处理。 但似乎所有的ugprades到JSF2.0,有可能是现在可用的东西。

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

Answer 1:

您可以手动创建和构建视图时恢复视图返回null时回传 。 您可以在自定义做到这一点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组件树,其此后被制成,或者通过taghandlers或有条件基于一些视图或呈现部件甚至会话范围变量,完全丧失。 为了准确地重建所需的视图,你需要确保这些修改是根据要求订做范围变量(读:请求参数),而不是观点或会话范围的变量。

换句话说,该视图的状态不应该依赖于视图或会话范围的托管bean,而纯粹是在请求范围管理的Bean。


更新 :该OmniFaces JSF工具库具有在当前1.3快照在风味一个可重复使用的溶液<o:enableRestorableView>其中可以嵌入<f:metadata> 。 另请参见<o:enableRestorableView>上的快照现场展示页面进行演示。



Answer 2:

这里有几个的,你可以使用的选项:

允许用户后会话超时登录了JSF 2.0

(如果你是开放的使用他们,你可以使用一个组件PrimeFaces。) http://www.primefaces.org/showcase/ui/idlemonitorHome.jsf



Answer 3:

我还没有尝试过,但我认为这实际上是新的JSF功能“无国籍意见”的理想应用。

只需设置“瞬间”在JSF的观点:

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

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

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

也看到了这个问题: 什么是无国籍的JSF用处?

不幸的是,该功能仅适用于钻嘴鱼科V2.1(和MyFaces的2.2)可用,因此您可能需要从2.0升级。



文章来源: Can you POST to JSF2 page with an expired session?