2009-07-16 58 views
1

我有登錄頁面的請求範圍支持bean(我正在使用Spring Security)。當發生認證錯誤時,將它放到上下文中,我試圖向我的頁面添加錯誤消息。從JSF中的方法添加消息

public void doLogin() throws IOException { 
    final FacesContext context = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = context.getExternalContext(); 
    externalContext.dispatch("/j_spring_security_check"); 

    if (externalContext.getRemoteUser() == null) { 
     Exception loginError = (Exception) externalContext.getSessionMap().get(
       AbstractProcessingFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY); 
     if (loginError instanceof BadCredentialsException) { 
      externalContext.getSessionMap().put(
        AbstractProcessingFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY, null); 
      context.addMessage("loginBtn", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid credentials!", null)); 
      context.responseComplete(); 
     } 
    } 

    context.renderResponse(); 
} 

我的網頁:

<a4j:form prependId="false"> 
     <h:panelGrid columns="2" cellpadding="5" > 
      <h:outputText value="#{msgs.login_username}"/> 
      <h:inputText id="j_username"/> 

      <h:outputText value="#{msgs.login_password}"/> 
      <h:inputSecret id="j_password"/> 

      <h:outputText value=" "/> 
      <f:facet name="footer"> 
       <h:panelGroup> 
        <h:commandButton type="submit" id="loginBtn" action="#{guest.doLogin}" value="#{msgs.login}" /> 
        <rich:spacer width="5" height="1"/> 
        <rich:message id="errorForLogin" for="loginBtn"> 
         <f:facet name="errorMarker"> 
          <h:graphicImage value="./resources/forbidden.gif"/> 
         </f:facet> 
        </rich:message> 
       </h:panelGroup> 
      </f:facet> 
     </h:panelGrid> 
     <br/><br/> 
    </a4j:form> 

但它不工作。我試圖把錯誤顯示代碼@PostConstruct方法,但這並沒有幫助。只有在實現PhaseListener的情況下才能使用此工作,但我認爲這是個壞主意,因爲它會調用每個請求。我的錯誤是什麼,有什麼方法可以在方法中添加錯誤消息,也許在@PostConstruct方法中?

回答

0

你可以從另一端來解決這個問題。在您使用SpringSecurity時,您可以繼承AuthenticationProcessingFilter並覆蓋onUnsuccessfulAuthentication方法。在那裏,你可以把代碼放在期望的行爲上。然後,您只需在Spring Security的相應bean定義中指定您的自定義身份驗證處理過濾器類而不是AuthenticationProcessingFilter。