EJB:如何检查用户是否已通过身份验证
EJB: how to check user is authenticated
使用 JSP 形式记录:
@ManagedBean
@SessionScoped
public class LoginView {
private String username; //+getter +setter
private String password; //+getter +setter
public String submit()
{
try {
HttpServletRequest request = (HttpServletRequest) FacesContext
.getCurrentInstance()
.getExternalContext()
.getRequest();
request.login(username, password);
} catch (ServletException e) {
FacesContext.getCurrentInstance().addMessage("login-form:username",
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Validation Error", "Incorrect login or password"));
return "/login";
}
return "/index?faces-redirect=true";
}
}
如何通过 EJB 检查用户登录?
下面是我需要的例子:
@Stateless
public class SessionServiceBean {
@Resource
SessionContext sessionContext;
@EJB
UserService userService;
@Produces
@Named
@LoggedIn
public User getLoggedUser() {
if (/* check user is logged */) {
return userService.getByName(sessionContext.getCallerPrincipal().getName());
}
}
}
我只发现未记录的使用名称为 "anonymous",但我认为这不是更好的方法。
- 您正在使用@Stateless EJB。在无状态 EJB 中,您使用的是用户会话。这可能不对,bean 应该是@Stateful。
- 我认为在您的示例中使用 EJB 毫无意义。使用带有 @SessionScoped 注释的纯 CDI bean 就足够了。
您可以将用户的会话信息直接存储在会话范围的 bean 中。不需要使用 HttpServletRequest。例如:
@Named
@SessionScoped
public class UserSession implements Serializable {
private User activeUser;
public void logIn(User user) {
this.activeUser = user;
}
public void logOut() {
activeUser = null;
}
public boolean isLoggedIn() {
return activeUser != null;
}
public User getActiveUser() {
return activeUser;
}
}
使用 JSP 形式记录:
@ManagedBean
@SessionScoped
public class LoginView {
private String username; //+getter +setter
private String password; //+getter +setter
public String submit()
{
try {
HttpServletRequest request = (HttpServletRequest) FacesContext
.getCurrentInstance()
.getExternalContext()
.getRequest();
request.login(username, password);
} catch (ServletException e) {
FacesContext.getCurrentInstance().addMessage("login-form:username",
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Validation Error", "Incorrect login or password"));
return "/login";
}
return "/index?faces-redirect=true";
}
}
如何通过 EJB 检查用户登录?
下面是我需要的例子:
@Stateless
public class SessionServiceBean {
@Resource
SessionContext sessionContext;
@EJB
UserService userService;
@Produces
@Named
@LoggedIn
public User getLoggedUser() {
if (/* check user is logged */) {
return userService.getByName(sessionContext.getCallerPrincipal().getName());
}
}
}
我只发现未记录的使用名称为 "anonymous",但我认为这不是更好的方法。
- 您正在使用@Stateless EJB。在无状态 EJB 中,您使用的是用户会话。这可能不对,bean 应该是@Stateful。
- 我认为在您的示例中使用 EJB 毫无意义。使用带有 @SessionScoped 注释的纯 CDI bean 就足够了。
您可以将用户的会话信息直接存储在会话范围的 bean 中。不需要使用 HttpServletRequest。例如:
@Named
@SessionScoped
public class UserSession implements Serializable {
private User activeUser;
public void logIn(User user) {
this.activeUser = user;
}
public void logOut() {
activeUser = null;
}
public boolean isLoggedIn() {
return activeUser != null;
}
public User getActiveUser() {
return activeUser;
}
}