2014-02-09 85 views
0

我正在開發一個帶有JSF 2.0,hibernate和primefaces的網站。 其實我正在實施管理面板,網站管理員可以將整個應用程序置於「維護模式」。這是通過更改應用程序作用域bean上的標誌(稱爲「AppConfigurationBean」)來完成的。 如果標誌處於活動狀態,則用戶必須通過faces-config.xml中聲明的條件導航規則返回到名爲「maintenance.xhtml」的頁面。 用戶可以通過插入管理員很少發出的特殊旁路鍵來繞過維護頁面。如果他這樣做,會在特殊會話範圍的bean上激活一個標誌,該標誌保存有關用戶的信息,並被稱爲「CurrentClientSessionBean」。 如果從CurrentClientSessionBean上的一個特殊方法返回的值(其中包含應用程序bean的維護模式標誌和自身的「繞過密鑰」標誌),導航規則將起作用。有條件的導航無法在JSF中正常工作

這裏是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匹配真實的,並且如果真實的話,則對主頁進行簡單的導航。

現在的條件導航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

還是沒人回答?至少請告訴我如何在JSF生命週期中調試導航階段 – Katuiros

回答

0

好吧,我終於找到了解決方案:它似乎我在主頁上添加了一個連接到maintenanceModeOn布爾標誌的重定向,並沒有計算hasBypassKey標誌。

這個規則深深地嵌套在很久很久以前我寫的代碼的一部分,我忘了。

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

請關閉這個問題。 謝謝大家空餘時間通過查看這個問題