我在应用程序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";
}
}
您基本上是在会话中设置一个布尔值来指示用户是否登录。
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
是否不等于null
。
User user = (User) session.getAttribute("user");
if (user != null) {
// User is logged in.
} else {
// User is not logged in.
}
这立即解决了获取"当前"用户的问题。#{user}
已经提供了这种方式。
<p>Your email is #{user.email}.</p>
与具体问题无关,您最好不要在JSF工件中从JSF的掩护下抓取原始HttpSession
。getSession(false)
中的false
论点也是另一个思维错误,容易在后面出现NullPointerException
。请使用ExternalContext#getSessionMap()
。
context.getExternalContext().getSessionMap().put("user", user);