【问题标题】:Forcing a welcome page强制打开欢迎页面
【发布时间】:2013-11-03 11:11:34
【问题描述】:

我有一个 JSF 2.0 应用程序,它有一个称为协议的 bean。这个应用程序总共有 4 个页面:main.xhtml、details.xhtml、generation.xhtml 和 generationFailed.xhtml。正确的导航顺序应该是 main.xhtml -> details.xhtml 并给定特定条件,generation.xhtml 或 generationFailed.xhtml。

顺序必须是这样,因为为了正确显示 details.xhtml 和生成页面,必须根据用户在 main.xhtml 中的输入构建一个 bean。

问题是客户可以通过在浏览器中输入 URL 地址直接进入任何页面。因此,当加载例如 details.xhtml 时,它会抛出错误,因为协议 bean 有几个空属性。我必须以某种方式知道协议 bean 的属性是否为 null(该属性称为 id),如果为 null,则强制重定向到 main.xhtml。

有什么想法吗?

【问题讨论】:

  • 你可以使用像this这样的会话验证来做你想做的事

标签: jsf jsf-2


【解决方案1】:

当用户从 main.xhtml 导航到任何页面时,将 main.xhtml bean 的属性放入 flash 范围内

       public String gotoDetails() {  
       getFlash().put("id", Id);  
       return "/pages/details?faces-redirect=true";  
  }

然后在 Details bean 中检查此属性以确保它不为空,否则将用户重定向到主页以首先选择订单或其他任何内容。使用此方法进行检查

      public void loadPage(ComponentSystemEvent cse) {  
       if (null == getID()) {  
            FacesContext  
                      .getCurrentInstance()  
                      .getApplication()  
                      .getNavigationHandler()  
                      .handleNavigation(FacesContext.getCurrentInstance(), null,  
                                "/pages/main?faces-redirect=true");  
       }  
  }  

那么就可以在details.xhtml中调用preRenderView event中之前的方法了,使用

    <f:event listener="#{yourdetailsbean.loadPage}" type="preRenderView" />   

【讨论】:

    【解决方案2】:

    您必须对页面使用过滤器,并为每个客户端构建一个虚拟状态机。状态机保留您描述的导航规则:main.xhtml -> details.xhtml -> generation.xhtml 或 generationFailed.xhtml。通过将状态保存在 cookie 或您喜欢的任何内容中(在会话中或以某种方式通过服务器端),您可以通过检查实际状态来进行管理,如果实际请求是合法的..

    【讨论】:

      【解决方案3】:

      好吧,如果用户输入一个 URL,浏览器会发送一个 GET 请求,但是如果他们提交一个表单,它会提交一个 POST 请求。您可以简单地编写一个 servlet Filter,将 FacesServlet 的所有 GET 请求重定向到欢迎页面。

      【讨论】:

        【解决方案4】:

        创建一个 sessionscoped bean 并添加 3 个布尔值:

        firstPageVisited、secondPageVisited、thirdPageVisited。

        在第 4 页检查 thirdPageVisited 是否为假,重定向到 3,如果 secondPageVisited 为假,则在第 3 页重定向到 2...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-29
          • 2015-03-28
          • 2015-06-22
          • 2012-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多