簡體   English   中英

更改 JSF SessionScoped Bean 的值以注銷用戶

[英]Changing the value of a JSF SessionScoped Bean to log out user

我正在為學校項目制作一個小型網站,但我在如何注銷用戶方面遇到了一些困難。 我處理登錄用戶的方式只是將他們的用戶名寫入@SessionScoped bean,然后使用它來訪問他們的其余信息。 我將它們注銷的計划是簡單地將用戶名設置回 null。

用戶Bean.java

@Data
@Named
@SessionScoped
public class UserBean implements Serializable {

    private String username;

    public boolean isLoggedIn() {
        return username != null;
    }

}

登錄控制器.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());
    }

}

登出控制器.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>

這就是我調用 logoutController 的方式:

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

現在登錄方法效果很好,我可以通過編寫#{userBean.username}從 bean 獲取用戶名。 但是,由於某種原因,當我按下commandButton將用戶注銷時沒有任何反應。 我是在以不正確的方式調用它還是這里發生了其他事情?

為了有效地注銷用戶,會話應該被銷毀,並保持登錄狀態(刪除 cookie 等)。 要銷毀會話,注銷方法必須包含以下內容:

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

這會使當前會話無效(銷毀)並且所有值都將被重置,如果用戶留在一邊,將創建一個具有默認值和新 id 值的新會話。

重定向到公共視圖也是一個好主意,這樣用戶就不會看到403頁面。 然后只需返回:

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

部分講座:

注銷后的 JSF 壽命

如何在 JSF 托管 bean 中創建、訪問和銷毀會話?

使用 j_security_check 在 Java EE / JSF 中執行用戶身份驗證

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM