Java Desktop - Como criar sessão?

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

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.

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

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?

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

1 curtida

Você fala de serialização?

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

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.

2 curtidas

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

a sessao funcionou direitinho …

Valeu…

poderia me passar o codigo, estou precisando

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.

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

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

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

[quote=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.
[/quote]

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 ?

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

Você criou o objeto usuario ??

Usuario usuario = new Usuario();

[quote=wellington.nogueira][quote=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 ?[/quote]
Você criou a variável usuario?
[EDIT] Não vi que já havia sido respondido com o mesmo questionamento :roll: [/EDIT][/quote]

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

[quote=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).[/quote]

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

Qualquer novidade ou duvida eu posto aqui !

Obridago :smiley:

[]'s

[quote=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).[/quote]

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