0

我有一个 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。

有任何想法吗?

4

4 回答 4

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");  
       }  
  }  

preRenderView event然后您可以使用在 details.xhtml中调用上一个方法

    <f:event listener="#{yourdetailsbean.loadPage}" type="preRenderView" />   
于 2013-10-24T21:58:16.730 回答
1

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

于 2013-10-24T16:23:35.587 回答
0

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

firstPageVisited、secondPageVisited、thirdPageVisited。

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

于 2013-10-24T18:43:11.257 回答
0

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

于 2013-10-24T18:00:33.050 回答