Java 更改JSF SessionScoped Bean的值以注销用户
我正在为一个学校项目制作一个小网站,但我正在为如何注销用户而挣扎。我处理用户登录的方法只是将他们的用户名写入Java 更改JSF SessionScoped Bean的值以注销用户,java,authentication,jsf,Java,Authentication,Jsf,我正在为一个学校项目制作一个小网站,但我正在为如何注销用户而挣扎。我处理用户登录的方法只是将他们的用户名写入@SessionScopedbean,然后使用它访问他们的其余信息。我注销它们的计划是简单地将用户名设置回null UserBean.java @Data @Named @SessionScoped public class UserBean implements Serializable { private String username; public boolea
@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());
}
}
@Named
@RequestScoped
public class LogoutController {
@Inject
private UserBean userBean;
public void logout() {
userBean.setUsername(null);
}
}
LogoutController.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());
}
}
@Named
@RequestScoped
public class LogoutController {
@Inject
private UserBean userBean;
public void logout() {
userBean.setUsername(null);
}
}
从中调用的xhtml插入(menuDropdown.xhtml):
菜单
这就是我如何称呼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";
一些讲座:
尝试通过
ExternalContext
使会话无效,所有数据都将丢失。如果您需要,我可以提供解决方案尝试将@RequestScoped
设置为@ViewScoped
,并尝试添加System.out.println(“一些文本”)
查看是否调用了该方法您是否已经更改了@RequestScoped
?浏览器控制台(F12)中是否有任何异常?请参见,谢谢!这与在按钮周围用
标记替换
标记相结合,就达到了效果