我正在使用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><!DOCTYPE html></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>
维护支持非常简单,它只是检查旁路键是否与真实匹配,如果为真,则执行到主页的简单导航。
现在,条件导航的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);
}
}
以下是主要问题:由于某些奇怪的原因,当维护模式处于活动状态时,即使用户将右侧旁路键放入输入中,也会强制用户返回维护页面。
此外:我的应用程序中肯定存在一些问题,因为我试图评论条件导航规则,这意味着维护页面应该无法访问,并且更改维护模式应该没有效果在应用程序上,但仍然维护模式系统继续以我所描述的相同态度工作。
请帮助我,抱歉,如果我不够清楚的话。向我询问你对代码不了解的任何事情。
答案 0 :(得分:0)
好的,我终于找到了解决方案:似乎我在主页上添加了一个重定向,该重定向连接到了maintenanceModeOn布尔标志,并且没有计入hasBypassKey标志。
这个规则深深地嵌入了我很久以前写过的代码的某些部分,我忘记了。
<h:panelGroup rendered="#{appConfigurationBean.maintenanceModeOn}">
<script>
window.location = "maintenance.faces";
</script>
</h:panelGroup>
请关闭此问题。 感谢大家通过查看这个问题的空余时间