Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改JSF SessionScoped Bean的值以注销用户_Java_Authentication_Jsf - Fatal编程技术网

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)中是否有任何异常?请参见,谢谢!这与在按钮周围用
标记替换
标记相结合,就达到了效果