3

我有一个 AuthenticatorBean 声明如下:

@Named
@SessionScoped
public class AutenticadorBean implements Serializable {

    @Inject
    private AutenticadorService autenticadorService;

此 bean 调用 AutenticadorService 内部的一个方法,该方法验证用户凭据并在 Session 中 @Produces 该用户,如下所示:

@SessionScoped
public class AutenticadorServiceImpl implements AutenticadorService, Serializable {

    @EJB
    private AnalistaRepository analistaRepository;

    private Analista analistaSessao;

    @Override
    public void inserirSessaoDadosLogin(String login) {
          analistaSessao = analistaRepository.buscaPorUserName(login);
    }

    @Produces
    @Named("analistaSessao")
    public Analista getAnalistaSessao() {
          return analistaSessao;
    }
}

我第一次登录应用程序时,它会在会话中生成用户,但问题是在我注销后,用不同的用户再次登录,然后尝试

@Inject 
Analista analistaSessao 

在其他服务中,该属性在我注销之前由第一个用户加载。但是如果我直接在 AutenticadorService.getAnalistaSessao(); 中访问 analistaSessao 它返回正确的用户,这是我登录的第二个用户。

这是我的注销代码:

public String logout() throws IOException {
    FacesContext facesContext = FacesContext.getCurrentInstance();  
    ExternalContext ex = facesContext.getExternalContext();  
    ex.invalidateSession();
    return "/home?faces-redirect=true&logout=true";
}

有谁知道这种行为的原因?

谢谢。

4

1 回答 1

2

我认为您所做的应该有效,因为您使会话无效。

尝试从您的 AutenticadorServiceImpl 中删除 getAnalistaSessao() 上的 @Produces 和 @Named 并将此 @Model 类添加到您的代码中。

@Model
public class AnalistaProducer {

    @Inject
    private AutenticadorService autenticadorService;

    @Produces
    @Named
    public Analista getAnalistaSessao() {
          return autenticadorService.getAnalistaSessao();
    }
}
于 2013-04-28T00:33:14.093 回答