[英]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";
部分講座:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.