更改JSF SessionScoped Bean的值以注销用户



我正在为一个学校项目制作一个小网站,但我在如何注销用户方面有点困难。我处理登录用户的方法只是将他们的用户名写入@SessionScoped bean,然后使用该bean访问他们的其余信息。我注销他们的计划是简单地将用户名设置回null。

UserBean.java

@Data
@Named
@SessionScoped
public class UserBean implements Serializable {
    private String username;
    public boolean isLoggedIn() {
        return username != null;
    }
}

LoginController.java

@Named
@RequestScoped
public class LoginController {
    @Inject
    private UserBean userBean;
    @EJB
    private AccountDAO accountDAO;
    @Inject
    private LoginBackingBean loginBackingBean;

    public void validateEmailAndPassword() {
        if (accountDAO.usernameExist(userBean.getUsername())) {
            if (!(accountDAO.getAccountByUsername(userBean.getUsername())).getPassword().equals(loginBackingBean.getPassword())) {
                String msg = "Username or Password is incorrect";
                throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "", msg));
            }
        }
    }
    public void login() {
        userBean.setUsername(loginBackingBean.getUsername());
    }
}

LogoutController.java

@Named
@RequestScoped
public class LogoutController {
    @Inject
    private UserBean userBean;
    public void logout() {
        userBean.setUsername(null);
    }
}

它看到的xhtml插入从(menuDropdown.xhtml(调用:

<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      >
    <h:body>
        <ui:composition>
            <button class="btn btn-outline-dark" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                menu
            </button>
            <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
                <p:link class="dropdown-item" href="#">
                </p:link>
                <div class="dropdown-divider"></div>
                <div class="dropdown-item">
                    <h:commandButton class="btn btn-primary" value="Sign out" action="#{logoutController.logout}"></h:commandButton>
                </div>
            </div>
        </ui:composition>
    </h:body>
</html>

这就是我所说的注销控制器:

<h:commandButton class="btn btn-primary" value="Sign out" action="#{logoutController.logout()}"></h:commandButton>

现在登录方法工作得很好,我可以通过编写#{userBean.username}从bean中获得用户名。但是,由于某些原因,当我按下commandButton将用户注销时,不会发生任何事情。我是用错误的方式称呼它,还是这里发生了其他事情?

要有效注销用户,应销毁会话,并尽可能保持登录状态(删除cookie等(。要销毁会话,注销方法必须包含以下内容:

FacesContext.getCurrentInstance().getExternalContext().invalidateSession();

这将使当前会话无效(销毁(,并且所有值都将重置,如果用户仍然站在一边,则将创建具有默认id值和新id值的新会话。

重定向到公共视图也是一个好主意,这样用户就不会看到403页面。然后返回:

return "/index?faces-redirect=true";

一些讲座:

退出后的JSF寿命

如何在JSF管理的bean中创建、访问和销毁会话?

使用j_security_check 在Java EE/JSF中执行用户身份验证

相关内容

  • 没有找到相关文章

最新更新