Problemas com Login usando Faces e Filtro

5 respostas
townray

Estou estudando Faces e criei um aplicativo de Login (basico soh para fins didaticos). O objetivo é: o usuario inicia a aplicação, esta verifica se existe algum usuario na seção, se sim entra no menu senão desvia para a pagina de login. Está tudo normal, consigo logar, vai para o menu. Navego em outros sites normalmente, volto pro link e caio direto no menu. Se faço logout tento entrar no site e recebo o login novamente. Até aí SHOW. Só que se eu faço o login e fecho o browser… quando eu entro novamente no link a tela de login me aparece novamente como se não existisse usuario na sessão! OBS: estou usando Filtro. Gostaria de uma ajuda de vocês para tentar resolver esse problema. Seguem os códigos:

Bean que representa o usuario:

package bean;

import java.io.IOException;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;

public class UsuarioBean {

    private String usuario;
    private String senha;
    public static final String KEY = "usuario";
    
    public UsuarioBean() {
    }

    public UsuarioBean(String usuario, String senha) {
        setUsuario(usuario);
        setSenha(senha);
    }
    
    public String adicionarUsuarioSessao() {
        ExternalContext ectx = FacesContext.getCurrentInstance().getExternalContext();
        ectx.getSessionMap().put(UsuarioBean.KEY, this);
        return("sucesso");
    }

    // omitidos os sets e gets

    public String retirarUsuarioSessao() {
        ExternalContext ectx = FacesContext.getCurrentInstance().getExternalContext();
        ectx.getSessionMap().put(UsuarioBean.KEY, null);
        return("sucesso");
    }
}

O GerenciadorLogin que implementa Filter:

public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest)request;
        
        boolean autorizado = verificarPermissao((HttpServletRequest)request);

        if( (!autorizado) && (req.getRequestURI().indexOf("login.faces")<0) ){
            ((HttpServletResponse)response).sendRedirect("login.faces");
        } else {
            chain.doFilter(request, response);
        }
        
    }

    private boolean verificarPermissao(HttpServletRequest request) {
        // procuramos por uma sessão aberta e se ela não existir pedimos para que seja criada
        HttpSession sessao = request.getSession();
        UsuarioBean usuarioBean = (UsuarioBean) sessao.getAttribute(UsuarioBean.KEY);
        if(usuarioBean != null) {
            return(true);
        } else {
            return false;
        }
    }

web.xml - Filtro

<filter>
        <filter-name>GerenciadorLogin</filter-name>
        <filter-class>filtros.GerenciadorLogin</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>GerenciadorLogin</filter-name>
        <url-pattern>*.faces</url-pattern>
    </filter-mapping>

faces-config.xml

<managed-bean>
        <managed-bean-name>usuarioBean</managed-bean-name>
        <managed-bean-class>bean.UsuarioBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    <navigation-rule>
        <from-view-id>/login.jsp</from-view-id>
        <navigation-case>
            <from-outcome>sucesso</from-outcome>
            <to-view-id>/menu.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>
    <navigation-rule>
        <from-view-id>/menu.jsp</from-view-id>
        <navigation-case>
            <from-outcome>sucesso</from-outcome>
            <to-view-id>/login.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>

5 Respostas

cristianomariano

Não trabalho muito com sessões, mas até onde eu sei, a sessão é encerrada se a janela do browser é fechada, certo?

townray

Não é assim não. Pelo menos não deveria… como o servidor vai saber que vc fechou o browser?

urubatan

a sessão para o usuário acaba quando o browser é fechado sim …
o ideal é ter um botão para avisar ao sistema que este esta encerrando a sessão …
caso contrário para o sistema a sessão vai acabar quando ocorrer o timeout que pode ser configurado pelo web.xml

townray

urubatan:
a sessão para o usuário acaba quando o browser é fechado sim …
o ideal é ter um botão para avisar ao sistema que este esta encerrando a sessão …
caso contrário para o sistema a sessão vai acabar quando ocorrer o timeout que pode ser configurado pelo web.xml

Como? Não entendi bem a parte de “ter um botão para avisar ao sistema que este esta encerrando a sessão” … quem é o sistema nesse caso?

O que eu gostaria era que meu aplicativo funcionasse como o gmail por exemplo eu faço o login, e se eu fechar o browser, abrir novamente e acessar o site eu não preciso fazer o login novamente. Teoricamente no servidor minha sessão ainda estaria aberta pois no web.xml configurei para 30 min o timeout.

Não seria esse o comportamento “normal” ?

townray

urubatan:
a sessão para o usuário acaba quando o browser é fechado sim …
o ideal é ter um botão para avisar ao sistema que este esta encerrando a sessão …
caso contrário para o sistema a sessão vai acabar quando ocorrer o timeout que pode ser configurado pelo web.xml

Não entedi a parte que você fala “o ideal é ter um botão para avisar ao sistema que este esta encerrando a sessão …” quem é o SISTEMA nesse caso?

O comportamento que eu gostaria era como o do gmail… logamos e se fechamos o browser e reabrimos temos o acesso sem ter novamente que fazer o login.

Criado 18 de agosto de 2006
Ultima resposta 19 de ago. de 2006
Respostas 5
Participantes 3