0

我使用richfaces 4。我有带有属性的会话bean - 用户。如果用户为空,我希望我的 xhtml 页面不会呈现请求,因为我有带有 if-tag 的 faces-config.xml(见下文)。但是它们呈现(就在我输入 url myComp:8080/JSF/faces/clients.xhtml 时)并且我在调试器中看到用户属性未在会话 bean 中检查。

面孔-config.xml

<navigation-rule>
  <from-view-id>/login.xhtml</from-view-id>
      <navigation-case>
       <from-outcome>clients</from-outcome>
       <if>#{userBean.isUser}</if>
       <to-view-id>/clients.xhtml</to-view-id>
      </navigation-case>

我需要一些 VeiwHandler 还是 faces-config.xml 有什么问题?

4

1 回答 1

0

很明显它不会起作用,因为你实际上并没有导航/login.xhtml/clients.xhtml是吗?对于要评估的导航规则,您需要实际打开login.xhtml,然后通过该页面上的控件导航到clients.xhtml.

导航案例涵盖特定的导航案例,即 if-then-else 逻辑。因此,直奔结果完全忽略了导航逻辑。这就是为什么你最好在目的地实施验证。类似于以下内容,基于<f:event name="preRenderView"/>尝试以下内容clients.xhtml

  1. 将以下内容添加到您的clients.xhtml. 它规定了一种方法checkValidUser

    <f:metadata>
       <f:event  type="preRenderView" listener="#{myBean.checkValidUser}">
    </f:metadata>
    
  2. 在您的支持 bean 中,添加以下内容

    @ManagedProperty("#{userBean}")
    UserBean theUserBean;    //this injects the UserBean into the destination bean. I'm assuming UserBean is a SessionScoped bean here
    
    public void checkValidUser(){
      if(userBean.isUser==false){
          throw new ValidationException("not a valid user");
      }
    }
    

或者,您可以将@PostConstruct注释添加到checkValidUser并完全忽略 (1)。它将达到基本相同的效果,checkValidUser将在 bean 实例化后立即运行。基于faces-config.xml的导航方法,IMO 存在隐含的缺陷和乐观,因为您可以看到它太容易绕过和破坏您的应用程序

于 2013-04-08T15:20:12.327 回答