我用的是richfaces。我有一个带有属性- user的会话bean。如果user为null,我希望我的xhtml页面不会为请求呈现,因为我有带有if标记的faces-config.xml(见下文)。但是它们呈现(就在我键入url myComp:8080/JSF/faces/clients.xhtml时),并且我在调试器中看到会话bean中没有检查用户属性。
faces-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的错误?
显然这行不通因为你并没有从/login.xhtml
导航到/clients.xhtml
,对吧?对于要评估的导航规则,您需要实际在login.xhtml
上,然后通过该页上的控件导航到clients.xhtml
。
导航用例涵盖特定的导航用例,即if-then-else逻辑。所以直接进入结果完全忽略了导航逻辑。这就是为什么最好在目的地实现验证。基于<f:event name="preRenderView"/>
,在clients.xhtml
上尝试以下操作:
-
将以下内容添加到您的
clients.xhtml
。它规定方法checkValidUser
<f:metadata> <f:event type="preRenderView" listener="#{myBean.checkValidUser}"> </f:metadata>
-
在后台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中隐含着缺陷和乐观,因为正如您所看到的,它太容易被绕过并破坏您的应用程序