Java Desktop - Como criar sessão?

29 respostas
L

Estou com um probleminha pessoal, estou criando um pcc, (projeto de conclusão de curso) em java desk, e gostaria de saber se existe alguma forma de realizar uma sessão para guardar o id, o nome e o perfil do usuário ao realizar o login, para que dependendo o perfil eu gere a tela principal do programa usando setVisible para alguns componentes, e use o id e nome para identificar o setor e mostrar em um label. Preciso fazer isso para todas as telas e tals…

existe alguma maneira de fazer isso?

valew

29 Respostas

royma

Saudações, vc poderia salvar em um arquivo, mas o ideal é vc usar um banco de dados, ai vc poderia criar grupos de usuaŕios e tal.

Zeed01

Boa noite Colegas !

Não entendi direito, você quer uma maneira de salvar usuários e seus privilégios no banco de dados ou quer que, após o usuário se logar no sistema poder validar seus privilégios ?

Bom, se for a segunda opção, que eu acho que deve ser, precisa ver como vc esta fazendo a sua aplicação.
Uma idéia é após o login você criar um objeto Usuario com estas informações e utilizá-lo para verificar os privilégios.

[]s

L

Acredito que me expressei mal, eu até pensei em fazer isso registrando no banco de dados, a idéia é a seguinte, o banco de dados irá ficar em um servidor, nas máquinas locais irá ficar a aplicação, vários usuários irão acessar o banco ao mesmo tempo, até ai beleza. O meu problema é que, o usuário realiza o login, a classe de validação vai verificar os dados do usuário e guardar o número do perfil do usuário, estando OK, vai para a tela principal, aí é que eu preciso “puxar” os dados da tela de login, para que seja utilizado nas outras telas do sistema para por exemplo, mostrar ou não componentes como menu, utilitários etc. Se eu criar uma classe Ex:

public class Sessao

{

public int perfil, cod;

public void dados(int cod_usuário, int perfil_usuário)

{

this.perfil = perfil_usuario;

this.cod_usuário = cod;

}

}

Assim, eu passo no login os parametros pedidos e gravo nessa classe certo.
porém quando eu criar novamente uma referência a esta classe em outra tela, ela não vai “zerar” a minha classe sessão?

Zeed01

Bom dia Colegas,

Eu acho que você deveria fazer o seguinte:

Ao validar o usuario, ja trazer todos os seus privilegios de acessos, e criar um objeto do tipo:

public class Usuario {
   private int id;
   private String nome;
   private String o_que_mais_voce_quiser
   private List<JFrame> telasPermitidas;

}

Algo mais ou menos assim…
Na sua aplicação só teria uma única instancia de usuário, acho que poderia até usar o pattern Singleton pra isso.
Em cada tela que vc precisasse buscaria o usuário e teria sempre o mesmo, ou seja, o que foi criado na tela de login.
E claro, vc destruiria esse objeto no caso do logout.

[]s

L

Você fala de serialização?

jgbt

Bom,
basicamente vc precisa é um Map<K,V> que possa ser acessado em qualquer ponto do seu sistema.
Gere uma chave e armazene o seu objeto nela, como vc faria em uma session http.

[]´s

Felagund

cara bem simples, o que vc precisa é de um singleton que mantenha o seu usuario

por exemplo

public class Sessao{
   private static Sessao instance = null;
   private Usuario usuario;

   private Sessao(){
   }

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

   public Usuario getUsuario(){
       return usuario;
   }
   public static Sessao getInstance(){
         if(instance == null){
               instance = new Sessao();
         }
        return instance;
   }
}

usando da seguinte mandeira

Sessao sessao = Sessao.getInstance();
sessao.setUsuario(usuario);// //Usuario é um POJO qualquer;
//Esse codigo seria executado pos login.

e durante o sistema vc descobre o usuario logado

Sessao.getInstance().getUsuario();

Ou na Sessao vc pode armazenar um map para guardar mais infromações como um session HTTP.

G

Parabens…fiz login aqui no GUJ so pra te agradecer…

a sessao funcionou direitinho …

Valeu…

THIAGOANALISTA

poderia me passar o codigo, estou precisando

rmendes08

Cara, o pessoal já deu a dica, você não precisa desse código, é só se esforçar um pouquinho (um pouquinho mesmo) que você consegue.

THIAGOANALISTA

Valeu. Vou procurar aqui pra ver se acho alguma idéia.

Priuli

Estuda o pattern que o Felagund disse que você vai ter uma ideia… http://pt.wikipedia.org/wiki/Singleton

habinovich

irmao vc pode pegar esse codigo ai do Felagund ele e uma boa base pra qualquer session!!!

Agr0

Felagund:
cara bem simples, o que vc precisa é de um singleton que mantenha o seu usuario

por exemplo

public class Sessao{
   private static Sessao instance = null;
   private Usuario usuario;

   private Sessao(){
   }

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

   public Usuario getUsuario(){
       return usuario;
   }
   public static Sessao getInstance(){
         if(instance == null){
               instance = new Sessao();
         }
        return instance;
   }
}

usando da seguinte mandeira

Sessao sessao = Sessao.getInstance();
sessao.setUsuario(usuario);// //Usuario é um POJO qualquer;
//Esse codigo seria executado pos login.

e durante o sistema vc descobre o usuario logado

Sessao.getInstance().getUsuario();

Ou na Sessao vc pode armazenar um map para guardar mais infromações como um session HTTP.

Qnd eu coloco o segundo codigo ele da erro no usuario:Cannot find Symbol… Fiz a classe certinha e tal. Qnd eu coloco o codico pos login ele da erro.
Os imports estao ok ! Ñ sei pq ta dando esse erro : /

Sessao sessao = Sessao.getInstance();
sessao.setUsuario(usuario);// //Usuario é um POJO qualquer;
//Esse codigo seria exercutado pos login.

O erro eh no b[/b] !

O q porderia ser ?

adriano_si

Posta o código da tua classe onde estás chamando o Objeto Usuário e a StackTrace completa do erro…

Andre_Fonseca

Você criou o objeto usuario ??

Usuario usuario = new Usuario();
Agr0

wellington.nogueira:
Agr0:
Qnd eu coloco o segundo codigo ele da erro no usuario:Cannot find Symbol… Fiz a classe certinha e tal. Qnd eu coloco o codico pos login ele da erro.
Os imports estao ok ! Ñ sei pq ta dando esse erro : /

Sessao sessao = Sessao.getInstance();
sessao.setUsuario(usuario);// //Usuario é um POJO qualquer;
//Esse codigo seria exercutado pos login.

O erro eh no b[/b] !

O q porderia ser ?


Você criou a variável usuario?
[EDIT] Não vi que já havia sido respondido com o mesmo questionamento :roll: [/EDIT]

Desculpa a demora pessoal… Mas essa semana eu nao tive muito tempo de programar…

Entao: Problema resolvido :smiley: ! Estava faltando o tal Usuario usuario = new Usuario(); !

Estou com outro problema…

Qnd eu faço isso:

System.out.println(Sessao.getInstance().getUsuario());

ele NAO imprimi o nome do usuario…

Ele imprimi isso: controle.Usuario@5097d026

controle eh o nome do pacote onde a classe usuario esta !

Q diabo ta acontecendo ? rs !

[]'s

[]'s

Agr0

wellington.nogueira:
Você precisa sobreescrever o método toString() da classe Usuario.
Esse é o retorno padrão do método na classe Object (que você implicitamente herda).

Faz sentido… Amanha qnd eu chegar no trabalho eu vou fazer isso !

Qualquer novidade ou duvida eu posto aqui !

Obridago :smiley:

[]'s

Agr0

wellington.nogueira:
Você precisa sobreescrever o método toString() da classe Usuario.
Esse é o retorno padrão do método na classe Object (que você implicitamente herda).

Entao

Fiz o q vc falou e deu praticamente o mesmo erro !

O q eu fiz:

Usuario usuario = new Usuario();
            Sessao sessao = Sessao.getInstance();
            sessao.setUsuario(usuario); 

            Sessao.getInstance().getUsuario();
            System.out.println(sessao.toString());

o erro:

Logado com sucesso!!!
classes.Sessao@d18d189

Vou colar as classes envolvidas p ver se eu fiz alguma coisa errada !

public class Usuario {

    /* VARIÁVEIS DE CONEXÃO COM O BANCO DE DADOS SUPORTE02 */
    private String url = "jdbc:mysql://suporte02:3306/sasi";
    private String login = "root";
    private String senha = "suportedip";

    /* VARIÁVEL DE CONTROLE DE ERROS DO BANCO DE DADOS */
    private StringBuffer msg = new StringBuffer();

    /* VARIÁVEIS UTILIZADAS FORA DA CLASSE USUÁRIO */
    public String nome = "";
    public String cadastro = "";
    public Boolean resultado = false;

    /* MÉTODO PRIVADO PARA CONEXÃO COM O BANCO DE DADOS */
    private Connection ConectarBD(){
        Connection conexao = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conexao = DriverManager.getConnection(url, login, senha);

        } catch (ClassNotFoundException cnfex) {
            msg.append("Erro Driver!");

        } catch (SQLException sqlex) {
            msg.append("Não conectou ao banco!");
        }

        return conexao;
    }

    /* MÉTODO RESPONSÁVEL PELA VALIDAÇÃO DE USUÁRIO
     * O MESMO RECEBE O LOGIN E SENHA E VERIFICA SE
     * É O MESMO DO BANCO DE DADOS PARA CONFERÊNCIA
     */

    public Boolean validarUsuario(String matricula, String senha) {

        String sql = "";
        Connection conexao = ConectarBD();

        // INSERINDO A QUERY DO BANCO PARA PEGAR A SENHA ATRAVÉS DO NOME
        sql += " select * from funcionarios";
        sql += " where matricula = '"+matricula+"'";
        sql += " and senha ='"+senha+"'";
        // Validando o login e a senha com o retorno do registro
        try {
           Statement st = conexao.createStatement();
           ResultSet rs = st.executeQuery(sql);
           if (rs.next()) {
               resultado = true;
               nome = rs.getString("matricula");
           }
           conexao.close();
        } catch (Exception e){
            System.out.println("Erro na Validação!!!");
        }

        return resultado;
    }

  

}

Essa parte do codigo chama a classe no usuario p fazer o login !
Esse codigo aqui, fica na acao do botao !
PS: O login ta perfeito, sem problemas.

String matricula = jTextField1.getText();
        String senha = jPasswordField1.getText();

        Usuario user = new Usuario();

        boolean status = user.validarUsuario(matricula, senha);
        if (user.resultado == true) {
            String valor = matricula;
            System.out.println("Logado com sucesso!!!");

            Usuario usuario = new Usuario();
            Sessao sessao = Sessao.getInstance();
            sessao.setUsuario(usuario); 

            Sessao.getInstance().getUsuario();
            System.out.println(sessao.toString());


            //Abre o menu principal da app
            Menu1 m1 = new Menu1();
            m1.setVisible(true);
            m1.setResizable(false);
            this.setVisible(false);


        } else {
            // login novamente
            JOptionPane.showMessageDialog(null, " Dados não conferem. Tente novamente! ");
            jTextField1.setText("");      //limpando os campos
            jPasswordField1.setText("");
        }

A classe sessao, q eu peguei nesse topico !

package classes;


    public class Sessao{
       private static Sessao instance = null;
       private Usuario usuario;

       private Sessao(){
       }

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

       public Usuario getUsuario(){
           return usuario;
       }
       public static Sessao getInstance(){
             if(instance == null){
                   instance = new Sessao();
             }
            return instance;
       }
    }

Entao, o q eu to fazendo de errado ?
Abraço

Agr0
wellington.nogueira:
Agr0:
wellington.nogueira:
Você precisa sobreescrever o método toString() da classe Usuario. Esse é o retorno padrão do método na classe Object (que você implicitamente herda).

Entao

Fiz o q vc falou e deu praticamente o mesmo erro !

O q eu fiz:

....

Entao, o q eu to fazendo de errado ?
Abraço


E onde está a sobrescrita do método?

class Usuario {
  //Implementações do usuário

  //método sobrescrito
  @Override
  public String toString() {
    return nomeUsuario;
  }
}

Caso não faça isso, continuará a logar a informação.
No teu exemplo, você não SOBRescreveu, trocou a variável e declarou (escreveu) o método.

O sysout chama implicitamente o método toString quando o parâmetro informado não é do tipo String. Ou seja, dificilmente é necessário declará-lo.

Entao

Eu entendi mais ou menos o q vc quis dizer... So nao sei exatamente como fazer !

Tem como vc me ajudar + 1 uma vez e implemntar o vc ta falando ? !

Abraços

Agr0
wellington.nogueira:
Eu já coloquei um exemplo de como implementar o toString no meu post (que coloco novamente abaixo):
class Usuario {  
      //Implementações da classe usuário  
      
      //método sobrescrito  
      @Override  
      public String toString() {  
        return nome;  
      }  
    }
Mas vou descrever o que fiz: Declaração da classe
class Usuario {
Aqui vc troca pela implementação já feita
//Implementações da classe usuário
Agora, a sobreescrita do método:
//método sobrescrito  
      @Override  
      public String toString() {  
        return nome;  
      }

O mesmo pode ser feito para quaisquer classes.

Entao

Coloquei o metodo na classe usuario ! Vou colar a classe aqui:

public class Usuario {

    /* VARIÁVEIS DE CONEXÃO COM O BANCO DE DADOS SUPORTE02 */
    private String url = "jdbc:mysql://suporte02:3306/sasi";
    private String login = "root";
    private String senha = "suportedip";

    /* VARIÁVEL DE CONTROLE DE ERROS DO BANCO DE DADOS */
    private StringBuffer msg = new StringBuffer();

    /* VARIÁVEIS UTILIZADAS FORA DA CLASSE USUÁRIO */
    public String nome = "";
    public String cadastro = "";
    public Boolean resultado = false;

    /* MÉTODO PRIVADO PARA CONEXÃO COM O BANCO DE DADOS */
    private Connection ConectarBD() {
        Connection conexao = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conexao = DriverManager.getConnection(url, login, senha);

        } catch (ClassNotFoundException cnfex) {
            msg.append("Erro Driver!");

        } catch (SQLException sqlex) {
            msg.append("Não conectou ao banco!");
        }

        return conexao;
    }

    /* MÉTODO RESPONSÁVEL PELA VALIDAÇÃO DE USUÁRIO
     * O MESMO RECEBE O LOGIN E SENHA E VERIFICA SE
     * É O MESMO DO BANCO DE DADOS PARA CONFERÊNCIA
     */
    public Boolean validarUsuario(String matricula, String senha) {

        String sql = "";
        Connection conexao = ConectarBD();

        // INSERINDO A QUERY DO BANCO PARA PEGAR A SENHA ATRAVÉS DO NOME
        sql += " select * from funcionarios";
        sql += " where matricula = '" + matricula + "'";
        sql += " and senha ='" + senha + "'";
        // Validando o login e a senha com o retorno do registro
        try {
            Statement st = conexao.createStatement();
            ResultSet rs = st.executeQuery(sql);
            if (rs.next()) {
                resultado = true;
                nome = rs.getString("matricula");
            }
            conexao.close();
        } catch (Exception e) {
            System.out.println("Erro na Validação!!!");
        }

        return resultado;
    }

    public String toString() {
        return nome;
    }
}

Coloquei o metodo la no final !

Vou colar aqui o codigo pos login:

System.out.println("Logado com sucesso!!!");

            Usuario usuario = new Usuario();
            Sessao sessao = Sessao.getInstance();
            sessao.setUsuario(usuario); 

            Sessao.getInstance().getUsuario();
            System.out.println(Sessao.getInstance().getUsuario());

O "erro" mudou ! Qnd eu logo, nao aparace nada !

Alguma luz ?

Agr0
Agr0:
wellington.nogueira:
Eu já coloquei um exemplo de como implementar o toString no meu post (que coloco novamente abaixo):
class Usuario {  
      //Implementações da classe usuário  
      
      //método sobrescrito  
      @Override  
      public String toString() {  
        return nome;  
      }  
    }
Mas vou descrever o que fiz: Declaração da classe
class Usuario {
Aqui vc troca pela implementação já feita
//Implementações da classe usuário
Agora, a sobreescrita do método:
//método sobrescrito  
      @Override  
      public String toString() {  
        return nome;  
      }

O mesmo pode ser feito para quaisquer classes.

Entao

Coloquei o metodo na classe usuario ! Vou colar a classe aqui:

public class Usuario {

    /* VARIÁVEIS DE CONEXÃO COM O BANCO DE DADOS SUPORTE02 */
    private String url = "jdbc:mysql://suporte02:3306/sasi";
    private String login = "root";
    private String senha = "suportedip";

    /* VARIÁVEL DE CONTROLE DE ERROS DO BANCO DE DADOS */
    private StringBuffer msg = new StringBuffer();

    /* VARIÁVEIS UTILIZADAS FORA DA CLASSE USUÁRIO */
    public String nome = "";
    public String cadastro = "";
    public Boolean resultado = false;

    /* MÉTODO PRIVADO PARA CONEXÃO COM O BANCO DE DADOS */
    private Connection ConectarBD() {
        Connection conexao = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conexao = DriverManager.getConnection(url, login, senha);

        } catch (ClassNotFoundException cnfex) {
            msg.append("Erro Driver!");

        } catch (SQLException sqlex) {
            msg.append("Não conectou ao banco!");
        }

        return conexao;
    }

    /* MÉTODO RESPONSÁVEL PELA VALIDAÇÃO DE USUÁRIO
     * O MESMO RECEBE O LOGIN E SENHA E VERIFICA SE
     * É O MESMO DO BANCO DE DADOS PARA CONFERÊNCIA
     */
    public Boolean validarUsuario(String matricula, String senha) {

        String sql = "";
        Connection conexao = ConectarBD();

        // INSERINDO A QUERY DO BANCO PARA PEGAR A SENHA ATRAVÉS DO NOME
        sql += " select * from funcionarios";
        sql += " where matricula = '" + matricula + "'";
        sql += " and senha ='" + senha + "'";
        // Validando o login e a senha com o retorno do registro
        try {
            Statement st = conexao.createStatement();
            ResultSet rs = st.executeQuery(sql);
            if (rs.next()) {
                resultado = true;
                nome = rs.getString("matricula");
            }
            conexao.close();
        } catch (Exception e) {
            System.out.println("Erro na Validação!!!");
        }

        return resultado;
    }

    public String toString() {
        return nome;
    }
}

Coloquei o metodo la no final !

Vou colar aqui o codigo pos login:

System.out.println("Logado com sucesso!!!");

            Usuario usuario = new Usuario();
            Sessao sessao = Sessao.getInstance();
            sessao.setUsuario(usuario); 

            Sessao.getInstance().getUsuario();
            System.out.println(Sessao.getInstance().getUsuario());

O "erro" mudou ! Qnd eu logo, nao aparace nada !

Alguma luz ?

Entao

Fiz o seguinte:

@Override
    public String toString() {
        return nome;
    }

Nada ate agora !! :S

V

Loguei apenas para parabenizar pela resposta!

Funcionou perfeitamente!

L

Legal, não sabia desta tal “Singleton”
Mas fiquei com dúvidas sobre o funcionamento dela, por exemplo:
Quais são os valores atribuídos a cada nova sessão ou usuários criados?
Como esta classe identifica quando o usuário está logado ou deslogado?
Supondo que 10 pessoas se conectem em um servidor que tenha esta classe implementada, ela criará uma sessão para cada usuário?
Quando necessário, como ela identifica qual é o usuário que esta enviando alguma solicitação? (Quero dizer, qual o vínculo que ela tem com cada usuário que cria uma nova instancia?)

Eu vi o código postado, mas fiquei na dúvida sobre o funcionamento dela (não duvido que funciona, mas preciso saber como funciona…)

Obrigado!

WellingtonRamos

Agr0:
Qnd eu coloco o segundo codigo ele da erro no usuario:Cannot find Symbol… Fiz a classe certinha e tal. Qnd eu coloco o codico pos login ele da erro.
Os imports estao ok ! Ñ sei pq ta dando esse erro : /

Sessao sessao = Sessao.getInstance();
sessao.setUsuario(usuario);// //Usuario é um POJO qualquer;
//Esse codigo seria exercutado pos login.

O erro eh no b[/b] !

O q porderia ser ?


Você criou a variável usuario?
[EDIT] Não vi que já havia sido respondido com o mesmo questionamento :roll: [/EDIT]

WellingtonRamos

Você precisa sobreescrever o método toString() da classe Usuario.
Esse é o retorno padrão do método na classe Object (que você implicitamente herda).

WellingtonRamos
Agr0:
wellington.nogueira:
Você precisa sobreescrever o método toString() da classe Usuario. Esse é o retorno padrão do método na classe Object (que você implicitamente herda).

Entao

Fiz o q vc falou e deu praticamente o mesmo erro !

O q eu fiz:

....

Entao, o q eu to fazendo de errado ?
Abraço


E onde está a sobrescrita do método?

class Usuario {
  //Implementações do usuário

  //método sobrescrito
  @Override
  public String toString() {
    return nomeUsuario;
  }
}

Caso não faça isso, continuará a logar a informação.
No teu exemplo, você não SOBRescreveu, trocou a variável e declarou (escreveu) o método.

O sysout chama implicitamente o método toString quando o parâmetro informado não é do tipo String. Ou seja, dificilmente é necessário declará-lo.

WellingtonRamos

Eu já coloquei um exemplo de como implementar o toString no meu post (que coloco novamente abaixo):

class Usuario {  
      //Implementações da classe usuário  
      
      //método sobrescrito  
      @Override  
      public String toString() {  
        return nome;  
      }  
    }
Mas vou descrever o que fiz: Declaração da classe
class Usuario {
Aqui vc troca pela implementação já feita
//Implementações da classe usuário
Agora, a sobreescrita do método:
//método sobrescrito  
      @Override  
      public String toString() {  
        return nome;  
      }

O mesmo pode ser feito para quaisquer classes.

WellingtonRamos

Não aparece nada pq a String nome deve estar vazia. Use o depurador, coloque um breakpoint no return e verifique o conteúdo da variável.

Outra opção é inicializar essa variável com algum conteúdo (tipo String nome = “teste” ) só para verificar se imprime algo.

Criado 7 de maio de 2009
Ultima resposta 5 de ago. de 2011
Respostas 29
Participantes 17