3

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

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

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

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

4

3 回答 3

3

恢复的视图在发期间返回时,您可以手动创建构建视图。您可以在自定义中执行此操作。这是一个启动示例:nullViewHandler

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>快照站点上的展示页面以获取演示。

于 2012-09-25T15:57:43.987 回答
0

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

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

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

于 2012-09-26T12:03:11.943 回答
0

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

只需在 JSF 视图上设置“瞬态”:

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

一个很好的解释在这里:

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

另请参阅此问题:JSF 中无状态的用处是什么?

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

于 2014-06-04T10:23:24.687 回答