【问题标题】:Can you POST to JSF2 page with an expired session?您可以在会话过期的情况下发布到 JSF2 页面吗?
【发布时间】:2012-09-17 04:11:54
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: jsf jsf-2 viewexpiredexception


    【解决方案1】:

    restored viewpostback 期间返回null 时,您可以手动createbuild 视图。您可以在自定义 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 快照中具有 &lt;o:enableRestorableView&gt; 风格的可重用解决方案,可以嵌入到 &lt;f:metadata&gt; 中。另请参阅 &lt;o:enableRestorableView&gt; showcase page on snapshot site 以获取演示。

    【讨论】:

      【解决方案2】:

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

      Allow user to login after session times out JSF 2.0

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

      【讨论】:

        【解决方案3】:

        我没有尝试过,但我认为这实际上是 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 升级。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-15
          • 1970-01-01
          • 2012-07-29
          • 1970-01-01
          • 2019-03-06
          • 1970-01-01
          • 2017-07-23
          相关资源
          最近更新 更多