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…
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.
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?
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.
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.
[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.
[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.
[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 !
[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 !
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;
}
}