Boa tarde srs,
Tenho um sistema JSF + Richfaces que não permite sessões duplicadas de um usuário, este controle é feito por um número randômico que é gerado a cada acesso do usuário, tenho um servlet inicial que além de autenticar o usuário, ele verifica se o id deste já está em uma lista em um bean de aplicação, se já estiver por meio do out do servlet coloco uma mensagem para o usuário. Porém se o id do usuário ainda não está nesta lista ele pode acessar normalmente. E criei um sessionlistener para que ao encerrar a sessão o id do usuário seja removido da lista.
Meu problema é que em algumas situações quando o usuário acessa está dando "duplicate Id" nos componentes da minha tela jsf. Por meio de um phase listener eu vi que em algumas situações o faces está recuperando a view e renderizando-a (pulando da fase 1 para a 6). Tentei criar uma nova viewroot, porém quando passa pela 1ª fase do JSF ele recupera os componentes antigos e lasca tudo de novo!
Alguém sabe como forçar o JSF a "zerar o cache" (se é este o termo), ou forçá-lo a reconstruir a view, passando por todas as fases normalmente?
O código que utilizo para limpar a viewroot está abaixo, acesso ele pelo meu servlet de login.
protected FacesContext getFacesContext(HttpServletRequest request, HttpServletResponse response) {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (facesContext == null) {
FacesContextFactory contextFactory = (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
LifecycleFactory lifecycleFactory = (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
facesContext = contextFactory.getFacesContext(request.getSession().getServletContext(), request, response, lifecycle);
}
if(facesContext.getViewRoot() != null){
// set a new viewRoot, otherwise context.getViewRoot returns null
UIViewRoot view = facesContext.getApplication().getViewHandler().createView(facesContext,
"/inicio.xhtml");
facesContext.setViewRoot(view);
}
return facesContext;
}