2017-05-09 35 views
0

可以使用记录的穿透式JSP表单:EJB:如何检查用户进行身份验证

@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"; 
    } 
} 

如何检查用户登录thorug 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()); 
     } 
    } 

} 

我foun只表示没有登录使用具有名为“匿名”,但它没有更好的办法,我想。

回答

0
  1. 您正在使用@Stateless EJB。在无状态EJB中,您正在处理用户会话。这可能是不对的,bean应该是@Stateful。
  2. 我在你的例子中没有看到使用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; 
    } 

} 
相关问题