我在应用程序JSF中创建了一个过滤器和一个身份验证它运行得很好,但我想得到当前用户,我不知道该怎么做。 有人可以帮帮我吗?
此方法验证
public String Authenticates() {
FacesContext fc = FacesContext.getCurrentInstance();
EntityManager manager = getManager();
PersonDAO dao = new PersonDAOJPA(manager);
if (dao.login(getPerson().getEmail(), getPerson().getPassword())) {
ExternalContext ec = fc.getExternalContext();
HttpSession session = (HttpSession) ec.getSession(false);
session.setAttribute("userLogged", true);
getCurrentUser();
return "/index.xhtml" + "?faces-redirect=true";
} else {
FacesMessage ms = new FacesMessage("Email or Password Incorrect");
ms.setSeverity(FacesMessage.SEVERITY_ERROR);
fc.addMessage(null, ms);
return "/account.xhtml";
}
}
答案 0 :(得分:1)
您基本上在会话中设置布尔值以指示用户是否已登录。
if (userService.login(email, password)) {
session.setAttribute("userLogged", true);
}
这相当简单。这可以通过简单地将用户自己置于会话中来改进。
User user = userService.find(email, password);
if (user != null) {
session.setAttribute("user", user);
}
现在,无论您想要检查某个用户是否已登录,而不是检查userLogged
是否等于true
,您只需检查user
是否不等于{ {1}}。
null
这可以立即解决您获得当前"的问题。用户。这种方式已由User user = (User) session.getAttribute("user");
if (user != null) {
// User is logged in.
} else {
// User is not logged in.
}
提供。
#{user}
对于具体问题 无关,您最好不要从JSF工件的JSF掩护中获取原始<p>Your email is #{user.email}.</p>
。 HttpSession
中的false
参数也是另一个思维错误,后来容易出现getSession(false)
。相反,请使用NullPointerException
。
ExternalContext#getSessionMap()