清除h:页面刷新后的消息

时间:2015-06-28 15:55:24

标签: jsf spring-security

我有一个JSF登录页面(用于Spring Security)和一个全局消息,用于显示错误登录用户/传递的消息。

这是我的表格:

<f:event listener="#{loginBean.updateMessages}" type="preRenderView"/>

<h:form prependId="false" >

    <h:outputLabel value="User Name:" for="username"/>
    <h:inputText id="username" required="true" value="#{loginBean.name}"/>
    <h:message id="usernMsg" for="username"/> <br/>

    <h:outputLabel value="Password:" for="password"/>
    <h:inputSecret id="password" value="#{loginBean.password}" required="true"/>
    <h:message id="passMsg" for="password"/><br/>

    <h:messages id="glbMsg" globalOnly="true"/><br/>

    <h:commandButton value="Submit" action="#{loginBean.doLogin}"/>

</h:form>

我使用updateMessages()更新邮件:

public void updateMessages() {
    Exception ex = (Exception) FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
            .get(WebAttributes.AUTHENTICATION_EXCEPTION);

    if (ex != null) {
        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), ""));
        setUsername("");
        setPassword("");
    }
}

问题是当用户输入错误的凭据时,会显示消息,但是当用户刷新登录页面时(使用F5或者在文本字段为空时单击“提交”按钮),前一个全局消息({{1 }})值没有删除。

我在提交按钮中尝试了glbMsg,但它无效。

1 个答案:

答案 0 :(得分:3)

再次回顾这个问题,现在以正确的方式。您实际上并不想清除h:messages。您实际上想要清除异常(触发h:messages)。它每次都会重新显示,因为每次例外都不是null

Spring Security将上次身份验证失败存储为会话中的例外。你如何获得它的方式很明显:

Exception ex = (Exception) FacesContext.getCurrentInstance().getExternalContext()
    .getSessionMap().get(WebAttributes.AUTHENTICATION_EXCEPTION);

除非您使会话无效,否则Spring Security会自行删除它,它会在整个会话中保持不变。由于Spring Security显然没有删除它,你必须自己动手。

Exception ex = (Exception) FacesContext.getCurrentInstance().getExternalContext()
    .getSessionMap().remove(WebAttributes.AUTHENTICATION_EXCEPTION);