JSF中的条件导航无法正常工作



我正在用JSF 2.0、hibernate和primefaces开发一个网站。我正在实现一个管理面板,网站管理员可以将整个应用程序放在";维护模式";。这是通过更改应用程序范围的bean上的标志来完成的(根据目的调用AppConfigurationBean)。

如果该标志处于活动状态,则用户必须通过在faces-config.xml中声明的条件导航规则返回到名为maintenance.xhtml的页面。

用户可以通过插入管理员很少提供的特殊旁路密钥来绕过维护页面。如果他这样做,就会在一个特殊会话范围的bean上激活一个标志,该bean保存有关用户的信息,称为CurrentClientSessionBean

如果从CurrentClientSessionBean上的特殊方法返回的值计入应用程序bean上的维护模式标志;具有旁路密钥";把旗挂在自己身上。

以下是faces-config.xml:上的导航规则

<navigation-rule>
<description>System</description>
<from-view-id>*</from-view-id>
<navigation-case>
<display-name>Maintenance Mode</display-name>
<from-outcome>*</from-outcome>
<if>#{currentClientSessionBean.toReturnToMaintenance}</if>
<to-view-id>/maintenance.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>

这是maintenance.xhtml页面:

<ui:composition id="maintenance" xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:plm="http://java.sun.com/jsf/composite/plmCustomComponents">
<f:verbatim>&lt;!DOCTYPE html&gt;</f:verbatim>
<html>
<h:head>

<title>#{msg.applicationTitle}</title>

<meta charset="UTF-8"></meta>
<meta http-equiv="content-type" content="text/html; charset=utf-8"></meta>

<h:outputStylesheet library="default" name="css/normalize.css" />
<h:outputStylesheet library="default" name="css/icons.css" />
<h:outputStylesheet library="default" name="css/main.css" />

</h:head>

<f:metadata>
<ui:include src="metadata/browserViewParams.xhtml" />
</f:metadata>

<h:body>

<div id="legalPart">
<ui:insert name="legalPart">
<ui:include src="/structure/legalPart.xhtml" />
</ui:insert>
</div>

<p:panel>

<h1>
<h:outputText value="#{msg.maintenancePageTitle}" />
</h1>
<p>
<h:outputText value="#{msg.maintenancePageBodyMsg}" />
</p>
<h:form>
<p:outputLabel for="bypassKeyInput"
value="#{msg.maintenancePageInsertBypassKeyLabel}" />
<br />
<p:inputText id="bypassKeyInput"
value="#{maintenanceBacking.keyBuffer}" required="true" />
<br />
<p:message for="bypassKeyInput" />
<p:commandButton value="#{msg.checkPassword}"
action="#{maintenanceBacking.checkBypassKey}" ajax="false" />
</h:form>

</p:panel>

<ui:debug />

</h:body>
</html>
</ui:composition>

维护支持非常简单,它只需检查bypasskey是否与true匹配,如果为true,则简单导航到主页。

现在条件导航的CurrentClientSessionBean方法是这样的:

/**
* Special getter that determines if user should return to maintenance
* 
* @return
*/
public boolean isToReturnToMaintenance(){
try{
AppConfigurationBean appConfigurationBean = JSFAppUtils.findApplicationBean("appConfigurationBean");
boolean result = ((!this.hasBypassKey) && appConfigurationBean.isMaintenanceModeOn());
return result;
}catch(NotFoundException e){
logger.error("NotFoundException thrown in isToReturnToMaintenance method", e);
throw new RuntimeException("NotFoundException thrown in isToReturnToMaintenance method", e);
}
}

这是主要问题:由于一些奇怪的原因,当维护模式处于活动状态时,即使用户在输入中输入了正确的旁路键,他也会被迫返回维护页面。

此外:我的应用程序中一定有一些真正的错误,因为我试图评论条件导航规则,这意味着维护页面应该是不可访问的,对维护模式的更改应该不会影响应用程序,但维护模式系统仍然以我所描述的相同态度工作。

我似乎在主页上添加了一个重定向,该重定向连接到maintenanceModeOn布尔标志,并且没有考虑hasBypassKey标志。

这个规则深深地嵌套在我很久以前写的代码的某个部分,我忘记了。

<h:panelGroup rendered="#{appConfigurationBean.maintenanceModeOn}">
<script>
window.location = "maintenance.faces";
</script>       
</h:panelGroup>`

相关内容

  • 没有找到相关文章

最新更新