gpt4 book ai didi

jsf - 不显示注销消息

转载 作者:行者123 更新时间:2023-12-05 01:23:10 24 4
gpt4 key购买 nike

当我从我的应用程序中注销时,它不会显示我的注销消息

我有一个 outputText 试图在我的 View 中显示消息 (<h:outputText id="message" value="#{loginMB.message}" />):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:o="http://omnifaces.org/ui"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
template="/WEB-INF/templates/template.xhtml">
<ui:define name="content">
<o:form id="login" includeViewParams="true">
<h:outputText id="message" value="#{loginMB.message}" />
... Another components ...
</o:form>
</ui:define>
</ui:composition>

这是我的支持 bean:

@ManagedBean
@SessionScoped
public class UserBB implements Serializable {

private String message;

public void logout() {
try {
message = "You have been logout successfully";

SecurityUtils.getSubject().logout();
Faces.invalidateSession();
Faces.redirect("login.xhtml");
} catch (Exception exception) {
... Another code ...
}
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}
}

为什么它不显示我的注销消息?

编辑:

退出方式:

public void logout() {
SecurityUtils.getSubject().logout();
Messages.addFlashGlobalInfo("You have successfully log out");
Faces.invalidateSession();
Faces.redirect("login.xhtml?faces-redirect=true&lo=t");
}

退出按钮:

<p:commandButton action="#{userBB.logout}" value="log out" />

最佳答案

Why it doesn't show my logout message?

因为您已将其分配为 session 范围 bean 的属性,然后使 session 无效并发送重定向。 session 的失效将破坏 session 范围和存储在其中的所有对象,包括 session 范围的托管 bean。此后的重定向将创建一个全新的请求和 session ,并且将重新创建所有 session 范围的托管 bean,并将所有属性设置为默认值。

这种方法有两个问题:

  1. 使用 <h:outputText>而不是 <h:message(s)>显示消息。
  2. 将消息存储在 session 范围而不是 flash scope .

要解决您的问题,请使用 <h:message(s)>显示消息并使用 FacesContext#addMessage()或者,由于您已经在使用 OmniFaces,它的 Messages 实用程序类,将消息添加到面孔上下文。您可以使用<h:messages globalOnly="true">仅显示全局消息(即具有 null 客户端 ID 的消息)。您可以使用 Flash#setKeepMessages() 告诉 JSF 将当前请求的所有消息存储在 flash 范围内。

因此,总而言之,应该这样做:

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

@ManagedBean
@RequestScoped // Doesn't need to be session scoped for the particular task.
public class UserManager {

public void logout() throws Exception {
SecurityUtils.getSubject().logout();
Messages.addFlashGlobalInfo("You have been logged out successfully");
Faces.invalidateSession();
Faces.redirect("login.xhtml");
}

}

对于感兴趣的,这里是使用“plain JSF”的样子:

    public void logout() throws Exception {
SecurityUtils.getSubject().logout();
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("You have been logged out successfully"));
ExternalContext externalContext = context.getExternalContext();
externalContext.getFlash().setKeepMessages(true);
externalContext.invalidateSession();
externalContext.redirect("login.xhtml");
}

重要的是 flash scope is severly broken in older Mojarra versions .您至少需要 2.1.27 才能解决所有这些问题。

关于jsf - 不显示注销消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23200386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com