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

时间:2014-02-09 22:07:19

标签: java hibernate jsf navigation conditional

我正在使用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>

维护支持非常简单,它只是检查旁路键是否与真实匹配,如果为真,则执行到主页的简单导航。

现在,条件导航的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);
        }
    }

以下是主要问题:由于某些奇怪的原因,当维护模式处于活动状态时,即使用户将右侧旁路键放入输入中,也会强制用户返回维护页面。

此外:我的应用程序中肯定存在一些问题,因为我试图评论条件导航规则,这意味着维护页面应该无法访问,并且更改维护模式应该没有效果在应用程序上,但仍然维护模式系统继续以我所描述的相同态度工作。

请帮助我,抱歉,如果我不够清楚的话。向我询问你对代码不了解的任何事情。

1 个答案:

答案 0 :(得分:0)

好的,我终于找到了解决方案:似乎我在主页上添加了一个重定向,该重定向连接到了maintenanceModeOn布尔标志,并且没有计入hasBypassKey标志。

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

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

请关闭此问题。 感谢大家通过查看这个问题的空余时间