[Resolvido!] Logout no JSF2 limpando os campos de login após o return "/login?

23 respostas
K

Olá pessoal, tudo bem? Sei que faz muito tempo que eu não posto nada, mas vamos lá!!

Estou com um probleminha durante um logout de uma aplicação.

o método:

public String logout() { FacesContext fc = FacesContext.getCurrentInstance(); HttpSession session = (HttpSession) fc.getExternalContext().getSession(false); session.invalidate(); setNomeSessao(""); this.usuario.setLogin(""); this.usuario.setSenha(""); return "/login?faces-redirect=true"; }

Funciona, realiza o logout, redireciona para a página de login, mas não limpa os campos de login e senha. Já tentei limpar através de um script na JSP e nada… já criei um botao pra limpar apoiado em um método no bean, usando o (HtmlInputText)uiViewRoot.findComponent e nada (neste caso, não me aparece nenhum erro no console).

Dei uma olhada na net, mas não encontrei nada que satisfaça essa necessidade.

Alguma dica dos GUJEIROS?

Vlw pessoal.

23 Respostas

A

você está utilizando aonde esses campos, em um template? Sempre que algo do tipo me enche o saco, eu imediatamente utilizo o script do jquery q não tem frescuras kkkkk. No caso da utilização de template, faça isso:

//no teus inputs tu adiciona essa classe
styleClass="login"

//no teu jquery
$(document).ready(function(){
     $(".login").val("");
});

agora todos os campos de login, quando aparecerem, estarão vazios

L

Na hora de logar você salva o usuario na sessão?

K

Uma coisa que eu esqueci de mencionar: ao sair do sistema através do logout, o nome do ultimo usuário fica gravado no campo da tela de login. Mesmo se eu abrir o sistema em outro computador, o nome aparece.

L

HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true); //Eu pego ObjetoSessao por que eu guardo outros objetos alem do usuario na sessão, mas se você só guarda o usuário obtem ele ObjetoSessao os = (ObjetoSessao) session.getAttribute(ObjetoSessao.USUARIO_SESSAO_KEY); os = null; session.setAttribute(ObjetoSessao.USUARIO_SESSAO_KEY,os); session.invalidate(); this.usuario = new Usuario();

K
andre.froes:
você está utilizando aonde esses campos, em um template? Sempre que algo do tipo me enche o saco, eu imediatamente utilizo o script do jquery q não tem frescuras kkkkk. No caso da utilização de template, faça isso:
//no teus inputs tu adiciona essa classe
styleClass="login"

//no teu jquery
$(document).ready(function(){
     $(".login").val("");
});
agora todos os campos de login, quando aparecerem, estarão vazios

Eae andre, blz?
Cara, estou usando o Primefaces. Na minha jsp está assim:

<h:form prependId="false" id="fLogin">
        <div align="center">
            <p:focus/>
            <p:panel style="width: 500px; background: white; height: 170px; border-color: #E8F4FA">
                <div align="center">
                    <h:panelGrid columns="2" cellpadding="1" cellspacing="2" 
                                 style="margin-top:40px;">
                        <h:outputLabel for="nome" value="Usuário:"/>
                        <h:outputLabel for="senha" value="Senha:" />        

                        <h:inputText id="nome" required="true"  styleClass="input"
                                     requiredMessage="Digite seu nome de usuário." 
                                     style="width:175px!important;" value="#{usuarioController.usuario.login}" />
                        <h:column>
                            <h:inputSecret id="senha" required="true" styleClass="input"
                                           requiredMessage="Digite uma senha." style="width:175px!important;" 
                                           value="#{usuarioController.usuario.senha}" />

                            <p:commandButton type="submit" value="Entrar" ajax="false" update="fLogin"
                                             title="Entrar" action="#{usuarioController.logar}">
                                <p:ajax event="click" update="loader"/>
                            </p:commandButton>
							                                                   
                        </h:column>

                        <p:message for="nome"/>
                        <p:message for="senha"/>
                    </h:panelGrid> 

                    <p:messages globalOnly="true" /> 



                </div>
            </p:panel>   
        </div>
    </h:form>

Já usei isso e tb não deu certo...

A

Quebra o usuário ao invés de dar o set nele:

public String logout() {  
    FacesContext fc = FacesContext.getCurrentInstance();  
    HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);  
    session.invalidate();  
    setNomeSessao("");  
    //this.usuario.setLogin("");  
    //this.usuario.setSenha("");  
    setUsuario(new Usuario());
    return "/login?faces-redirect=true";  
}
K

andre.froes:
Quebra o usuário ao invés de dar o set nele:

public String logout() { FacesContext fc = FacesContext.getCurrentInstance(); HttpSession session = (HttpSession) fc.getExternalContext().getSession(false); session.invalidate(); setNomeSessao(""); //this.usuario.setLogin(""); //this.usuario.setSenha(""); setUsuario(new Usuario()); return "/login?faces-redirect=true"; }

Não funfa andre… :frowning:

G

O usuário provavelmente não está mais na sessão, porém, o bean parece que está “preso”.

Qual scopo você utilizou para o bean de login? Sessão? Se for, tente mudar para View.

Lembre-se que em escopo @ViewScope não pode retornar nulo ou string vazia, se quiser “resetar” o bean.

K

Grinvon:
O usuário provavelmente não está mais na sessão, porém, o bean parece que está “preso”.

Qual scopo você utilizou para o bean de login? Sessão? Se for, tente mudar para View.

Lembre-se que em escopo @ViewScope não pode retornar nulo ou string vazia, se quiser “resetar” o bean.

Não dá para usar view. retorna esse erro:

java.lang.IllegalStateException: No Scope registered for scope 'view' org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1075) org.springframework.beans.factory.access.el.SpringBeanELResolver.getValue(SpringBeanELResolver.java:56) com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:71) org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189) com.sun.faces.application.ApplicationImpl.evaluateExpressionGet(ApplicationImpl.java:428) br.com.semges.utils.ForcarLoginPhaseListener.afterPhase(ForcarLoginPhaseListener.java:30) com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:189) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:107) com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) br.com.semges.utils.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:31) org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)

Existem outros métodos que gravam o usuário na session no mesmo bean. vou dar uma olhada pra ver o que ele está gravando.

K

Pessoal, resolvido em parte, o problema estava na forma como foi expressa o escopo da sessão, que anteriormente, estava na anotação @Scope(“session”), e foi substituída pela @SessionScoped, fazendo com que o bean e a sessão fossem limpas após o logout.

Porém, o nome ainda continua após o login, ou seja, quando o usuário seguinte logar junto com o anterior, na tela de login, aparecerá ainda o nome do usuário anterior que executou o logon.

L

Tem como postar seu bean?

K

na hora.

@Controller(value = "usuarioController")
@SessionScoped
//@Scope("session")
public class UsuarioController implements Serializable {

	private static final long serialVersionUID = 1L;
	@Autowired
	private Usuario usuario;
	@Resource
	private UsuarioDao usuarioDao;
	@Resource
	private UsuarioSistemaDao usuarioSistemaDao;
	private String nomeSessao;
	@Value("")
	private String senhaAtual, novaSenha;
	private List<String> sistemasPermitidos;
	private Boolean viewSessionExpired;
	@Value("false")
	private Boolean renderizaTabGerenciamento;
	private HttpSession session;
	private UIPanel panelForm;
	private UIForm fLogin;

	public UsuarioController() {
		this.sistemasPermitidos = new ArrayList<String>();
		this.nomeSessao = new String();
	}

	public void init() {
		this.sistemasPermitidos = new ArrayList<String>();
	}

	public String logar() {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			Usuario u = this.usuarioDao.buscarUsuarioPorLogin(this.usuario.getLogin().toUpperCase().trim());
			if (!u.getSenha().equals(ToEncryptMD5.toEncrypt(this.usuario.getSenha().toUpperCase().trim()))) {
				FacesUtils.messageError("Erro na combinação Login/Senha!");
			} else if (u.getHabilitado().equals(false)) {
				FacesUtils.messageError("Usuario sem permissão".toUpperCase());
			} else {
				List<Sistema> sisPerm = this.usuarioSistemaDao.sistemasPermitidos(u.getFuncionario().getPessoa());
				for (Sistema s : sisPerm) {
					this.getSistemasPermitidos().add(s.getDescricao());
				}
				FacesUtils.getSessionMap().put(Keys.MENU.getKey(),this.getSistemasPermitidos());
				if (this.getSistemasPermitidos().contains(Sistemas.SICDE.getSigla())) {
//					session.invalidate();
					getSession();
					context.getExternalContext().getSessionMap().put(Keys.USUARIO_EM_SESSAO.getKey(), u);
					setNomeSessao(u.getLogin());
					this.usuario = u;
					niveisUsuario();
//					limpar();
					return "/index?faces-redirect=true";
				} else {
					FacesUtils.messageError("Usuário sem permissão para acessar o Sistema SICDE".toUpperCase());
				}
			}
		} catch (NoResultException e) {
			//Exceção tratada em UsuarioDaoImpl
			FacesUtils.messageError("Usuário não cadastrado!");
		}
		return null;
	}

	public void mudarSenha(ActionEvent event) {
		FacesContext context = FacesContext.getCurrentInstance();
		Usuario u = usuarioEmSessao();
		if (!u.getSenha().equals(ToEncryptMD5.toEncrypt(this.senhaAtual.toUpperCase().trim()))) {
			FacesUtils.messageError("Senha atual incorreta! Por favor tente novamente!");
		} else {
			String s = ToEncryptMD5.toEncrypt(this.novaSenha.toUpperCase().trim());
			u.setSenha(s);
			this.usuarioDao.atualizar(u);
			context.getExternalContext().getSessionMap().put(Keys.USUARIO_EM_SESSAO.getKey(), u);
			FacesUtils.messageInfo("Senha atualizada com sucesso!");
		}
	}
	
	public void niveisUsuario(){
		Usuario u = usuarioEmSessao();
		List<String> l = new ArrayList<String>();
		for(UsuarioSistema us : u.getUsuarioSistemaCollection()){
			l.add(us.getNivelUsuario().getDescricao());
		}
		if(l.contains("ADMINISTRADOR")){
			this.renderizaTabGerenciamento = true;
		}		
	}

	private Usuario usuarioEmSessao() {
		return (Usuario) FacesUtils.getSessionMap(Keys.USUARIO_EM_SESSAO.getKey());
	}

	public String logout() {
		FacesContext fc = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
//		this.usuario.setLogin("");
//		this.usuario.setSenha("");
		session.invalidate();
		setNomeSessao("");
		setUsuario(new Usuario());
		return "/login?faces-redirect=true";
	}

	
	//LIMPAR O USUARIO E A SENHA DO CAMPO DE LOGIN
	public void limpar()
	   {
		   FacesContext facesContext = FacesContext.getCurrentInstance();
		   UIViewRoot uiViewRoot = facesContext.getViewRoot();
		   
		   HtmlInputText inputText = null;	   
		   HtmlInputSecret inputSecret = null;
		   		   
		   inputText = (HtmlInputText)uiViewRoot.findComponent("fLogin:nome");
		   inputText.setSubmittedValue("");
		   
		   inputSecret = (HtmlInputSecret)uiViewRoot.findComponent("fLogin:senha");
		   inputSecret.setSubmittedValue("");   

//		usuario = new Usuario();
//		FacesUtils.cleanSubmittedValues(fLogin);
		   	   
		   
	   }
	
	
	
	public void reset(ActionEvent event) {
		RequestContext context = RequestContext.getCurrentInstance();
		boolean componenteResetado = true;
		UIForm form = (UIForm) FacesContext.getCurrentInstance().getViewRoot()
				.findComponent("formNovaDemanda");
		FacesUtils.cleanSubmittedValues(form);
		context.addCallbackParam("componenteResetado", componenteResetado);
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String getNomeSessao() {

		return nomeSessao;
	}

	public void setNomeSessao(String nomeSessao) {
		this.nomeSessao = nomeSessao;
	}

	public String getSenhaAtual() {
		return senhaAtual;
	}

	public void setSenhaAtual(String senhaAtual) {
		this.senhaAtual = senhaAtual;
	}

	public String getNovaSenha() {
		return novaSenha;
	}

	public void setNovaSenha(String novaSenha) {
		this.novaSenha = novaSenha;
	}

	public List<String> getSistemasPermitidos() {
		return sistemasPermitidos;
	}

	public Boolean getViewSessionExpired() {
		return viewSessionExpired;
	}

	public void setViewSessionExpired(Boolean viewSessionExpired) {
		this.viewSessionExpired = viewSessionExpired;
	}

	public Boolean getRenderizaTabGerenciamento() {
		return renderizaTabGerenciamento;
	}

	public void setRenderizaTabGerenciamento(Boolean renderizaTabGerenciamento) {
		this.renderizaTabGerenciamento = renderizaTabGerenciamento;
	}

	public HttpSession getSession() {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		HttpServletRequest request = (HttpServletRequest) facesContext
				.getExternalContext().getRequest();
		this.session = request.getSession();
		return this.session;
	}

	public UIPanel getPanelForm() {
		return panelForm;
	}

	public void setPanelForm(UIPanel panelForm) {
		this.panelForm = panelForm;
	}

	public UIForm getfLogin() {
		return fLogin;
	}

	public void setfLogin(UIForm fLogin) {
		this.fLogin = fLogin;
	}
}
L

public String logout() { FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); setNomeSessao(""); setUsuario(new Usuario()); return "/login?faces-redirect=true"; }

K

lucasmadeira:

public String logout() { FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); setNomeSessao(""); setUsuario(new Usuario()); return "/login?faces-redirect=true"; }

Lucas. Preciso limpar na verdade o formulário de login ao logar no sistema.

L

Sim entendi seu problema, este método logout era pra ta fazendo isto, além de invalidar a sessão, pois seu login e senha do formulario na pagina esta associado ao login e senha do usuario no UsuarioController.

K

Exato. Mas ele está fazendo. Quando eu dou o logout, ele faz esse papel. O problema é que, quando o “usuário 1” acessa e permanece no sistema, e o “usuário 2” abre o navegador na página de login do sistema para logar, o nome do “usuário 1” estará na caixa de login ainda. Esse nome só desaparece se o “usuário 1” der o logout antes de outro usuário acessar o sistema.

É como se a sessão estivesse disponível para mais de um usuário.

L

No mesmo navegador? se sim isso é normal por causa do escopo agora se for de outro navegador ou computador tem algo errado.

K

OUtro navegador, outro computador.

K

Descobri um problema no gerenciamento de sessões. Vi que a sessão é criada antes do usuário logar, logo quando ele abre a página de login. Não creio que essa seja a maneira correta de se trabalhar. Isso, além do problema dele manter no formulário de login o nome do usuário do ultimo logon ativo. Problemas de se trabalhar com o código dos outros… heheheh

L

Conseguiu resolver?

K

ainda não! :frowning:

L

Tenta mudar esta linha de código context.getExternalContext().getSessionMap().put(Keys.USUARIO_EM_SESSAO.getKey(), u); na hora de salvar o usuario na sessão

por esta session.setAttribute(Keys.USUARIO_EM_SESSAO.getKey(), u);

aqui você ve a diferença entre elas http://stackoverflow.com/questions/1282251/saving-data-to-session-in-jsf

K

Obrigado a todos. Consegui uma solução com um colega aqui do trabalho (Rafael Alves), onde nós setamos a variável u.setLogin("") antes do retorno do método de logon. Resolveu o problema, não sei ainda se da maneira que deve ser. Agradeço a todos.

Criado 18 de maio de 2012
Ultima resposta 22 de mai. de 2012
Respostas 23
Participantes 4