Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redirect 使用JSF和Spring security注销后显示消息_Redirect_Jsf 2_Spring Security_Logout - Fatal编程技术网

Redirect 使用JSF和Spring security注销后显示消息

Redirect 使用JSF和Spring security注销后显示消息,redirect,jsf-2,spring-security,logout,Redirect,Jsf 2,Spring Security,Logout,我有一个具有登录和注销操作的应用程序。按下注销按钮后,我想重定向到登录页面,并在此处显示faces消息,其中包含成功注销的信息。现在,我正在努力转发faces消息。此消息不希望显示在登录对话框中。你能给我一些提示或给我推荐另一种方法吗?我正在使用JSF2.1和SpringSecurity4。我所尝试的: 注销方法 public String doLogout() throws ServletException, IOException { FacesContext facesContex

我有一个具有登录和注销操作的应用程序。按下注销按钮后,我想重定向到登录页面,并在此处显示faces消息,其中包含成功注销的信息。现在,我正在努力转发faces消息。此消息不希望显示在登录对话框中。你能给我一些提示或给我推荐另一种方法吗?我正在使用JSF2.1和SpringSecurity4。我所尝试的:

注销方法

public String doLogout() throws ServletException, IOException {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    HttpServletRequest request = ((HttpServletRequest) externalContext.getRequest());       
    RequestDispatcher dispatcher = request.getRequestDispatcher("/j_spring_security_logout");
    dispatcher.forward((ServletRequest) externalContext.getRequest(), (ServletResponse) externalContext.getResponse());

    facesContext.addMessage("", new FacesMessage("You have been successfully logged out."));
    externalContext.getFlash().setKeepMessages(true);

    FacesContext.getCurrentInstance().responseComplete();
    return null;
}
登录XHTML

<h:form id="loginForm" prependId="false">
    <p:dialog visible="true" resizable="false" closable="false" draggable="false" position="center">
            <p:messages globalOnly="true" id="msgs"/>

            <h:outputLabel for="j_username" value="User" />
            <p:inputText id="j_username" required="true"/>
            <h:outputLabel for="j_password" value="Password" />
            <p:password id="j_password" required="true"/>
            <p:commandButton icon="ui-icon-check"
                             id="login"  
                             action="#{loginController.doLogin}"
                             oncomplete="handleLoginRequest(xhr, status, args)"
                             update="msgs"
                             ajax="false"/>
    </p:dialog>
</h:form>

Spring security

<http auto-config="true" >
    <intercept-url pattern="/pages/**" 
                   access="ROLE_RA"/>
    <form-login login-page="/pages/userLogin.xhtml"
                default-target-url="/pages/specimens/specimenOverview.xhtml" />
    <logout logout-success-url="/pages/userLogin.xhtml"/>
    <session-management invalid-session-url="/pages/userLogin.xhtml">
      <concurrency-control max-sessions="1"/>
    </session-management>
</http>

要注销的url的名称和参数:

<logout logout-success-url="/pages/userLogin.xhtml?logout=true"/>

在登录页面上检查并显示您的消息:

<h:outputText value="Your logout message here" rendered="#{param['logout']}" />


感谢您的回复!在重定向和重新创建会话后,是否有可能更新消息标记?我想使用,因为造型和整体一致性。技术上它是可能的,但将是复杂的。想法是在托管bean中处理输入请求参数,并在这里设置JSF消息。是的,这也是我的想法。但是,如果我重定向到另一个页面并创建新会话,则在传输消息时会遇到问题。我尝试了
externalContext.getFlash().setKeepMessages(true)但没有成功。不,不一样,getFlash()仍然使用当前会话运行,注销后将终止当前会话。注销完成后,您需要使用新创建的会话发送消息。@AlexChernyshev这种解决方案很有效。在我的例子中,它确实会注销用户并显示一条成功消息,但是,用户不能使用同一页面重新登录。它给出http 408错误。