有状态EJB不保留属性值



我使用有状态EJB来保存我的登录信息:

@Stateful
public class SecurityService {
    private static final Logger log4jLogger = Logger.getLogger(SecurityService.class);
    @Inject UtenteDao utenteDao;
    @Inject AutorizzazioneDao autorizzazioneDao;
    private Utente utenteCorrente;
    private Negozio negozioCorrente;
    public SecurityService() {
    }
    public boolean authenticate() {
        boolean result = false;
        Principal principal = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
        if (principal!=null) {
            utenteCorrente = utenteDao.findByUsername(principal.getName());
        }
        if (negozioCorrente!=null && utenteCorrente!=null) {
            Autorizzazione a = autorizzazioneDao.cercaPerNegozioAndUtente(negozioCorrente, utenteCorrente);
            result = a!=null;
        }
        return result;
    }

//……}

我的JSF登录页面由:

@Named
@RequestScoped
public class LoginController {
@Inject private SecurityService securityService;
private String username;    
private String password;
private Negozio negozio;
public void login() throws IOException {
    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext externalContext = context.getExternalContext();
    HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
    try {
        if (request.getUserPrincipal() != null) {
            request.logout();
        }
        request.login(username, password);
        securityService.setNegozioCorrente(negozio);
        if (!securityService.authenticate()) {
            throw new ServletException("Utente non abilitato.");
        }
        externalContext.redirect("/pippo/");
    } catch (ServletException e) {
        e.printStackTrace();
        context.addMessage(null, new FacesMessage("Accesso Negato"));        
    }
}
public void logout() throws IOException {
//...
}
public String getLoggedUsername() {
    Utente utenteCorrente = securityService.getUtenteCorrente();
    String fullName = "";
    if (utenteCorrente!=null) {
        fullName = utenteCorrente.getNomeCompleto();
    } else {
        System.out.println("Utente NULLO");
    }
    return fullName;
}
//... 

}

我的用户实际上可以以我想要的方式登录(从我的域添加一些编程安全性)。

我的问题在下一页,当你已经登录。我想在所有页面标题中显示"欢迎!"您以#{loginController.loggedUsername}的身份登录。

我一直得到null securityService.getUtenteCorrente()

SecurityService EJB的行为就像一个无状态会话bean!我想知道我是否误解了关于有状态ejb的一些东西,或者我只是遗漏了一些东西,以便按照我的期望工作。

我的目标只是有一个"会话范围"的bean来保持用户状态。EJB是必需的还是我可以只使用SessionScoped JSF ManagedBean?

LoginController是请求作用域,而SecurityService是依赖作用域(对于所有目的,它不是会话作用域,除非您这样指定它)。因此,当第二个JSF页面在EL表达式中引用LoginController时,将创建一个新的LoginController实例,该实例将引用SecurityService SFSB的不同实例。

如果您需要访问原始的SecurityService实例,您应该将其标记为@SessionScoped,以便像LoginController这样的客户端可以跨请求访问它们。但是,您可能还需要考虑为什么首先需要@Stateful注释,因为这个任务可以由@SessionScoped托管bean完成。您实际上并不需要SFSB来存储对User/Principal对象的引用。

为了管理会话bean,必须使用@EJB注释声明或使用JNDI查找,您注入它的方式只是给您一个普通对象,而不是由应用程序服务器管理,实际上您在任何时候使用它都创建了一个新对象。

相关内容

  • 没有找到相关文章

最新更新