更改 JSF SessionScoped Bean 的值以注销用户
Changing the value of a JSF SessionScoped Bean to log out user
我正在为一个学校项目制作一个小型网站,但我在如何注销用户方面遇到了一些困难。我处理用户登录的方法是将他们的用户名写入 @SessionScoped
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>
这就是我调用 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 值的新会话。
重定向到 public 视图也是一个好主意,这样用户就不会看到 403
页面。然后 return:
return "/index?faces-redirect=true";
一些讲座:
JSF life after logout
How to create, access and destroy session in JSF managed bean?
Performing user authentication in Java EE / JSF using j_security_check
我正在为一个学校项目制作一个小型网站,但我在如何注销用户方面遇到了一些困难。我处理用户登录的方法是将他们的用户名写入 @SessionScoped
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>
这就是我调用 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 值的新会话。
重定向到 public 视图也是一个好主意,这样用户就不会看到 403
页面。然后 return:
return "/index?faces-redirect=true";
一些讲座:
JSF life after logout
How to create, access and destroy session in JSF managed bean?
Performing user authentication in Java EE / JSF using j_security_check