2014-02-09 3 views
0

Я занимаюсь разработкой веб-сайта с JSF 2.0, спящими и первичными. На самом деле я реализую панель администратора, где администратор сайта может помещать все приложение в «режим обслуживания». Это делается путем изменения флага на компоненте, включенном в приложение (называемый целевым «AppConfigurationBean»). Если флаг активен, пользователь обязательно возвращается на страницу под названием «maintenance.xhtml» с помощью условного правила навигации, объявленного в faces-config.xml. Пользователь может обойти страницу обслуживания, вставив специальный ключ обхода, который может быть редко задан администратором. Если он это делает, флаг активируется на специальном компоненте, который содержит информацию о пользователе и называется «CurrentClientSessionBean». Правило навигации работает, если значение, возвращаемое специальным методом в CurrentClientSessionBean, которое учитывает флаг режима обслуживания на компоненте приложения и флажок «имеет байпасный ключ» на себе.Условная навигация не работает должным образом в JSF

здесь является правилом навигации по граням-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>

Пожалуйста, закройте этот вопрос. Спасибо всем за свободное время, которое вы пропустили при просмотре этого вопроса

Смежные вопросы