JSF2 + CDI @Produces保持旧的会话状态

时间:2013-02-05 17:28:25

标签: session jsf-2 cdi logout

我有一个AuthenticatorBean声明如下:

@Named
@SessionScoped
public class AutenticadorBean implements Serializable {

    @Inject
    private AutenticadorService autenticadorService;

这个bean调用AutenticadorService中的一个方法来验证用户 凭证和@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";
}

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

感谢。

1 个答案:

答案 0 :(得分:2)

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

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

@Model
public class AnalistaProducer {

    @Inject
    private AutenticadorService autenticadorService;

    @Produces
    @Named
    public Analista getAnalistaSessao() {
          return autenticadorService.getAnalistaSessao();
    }
}