Problemas com sistema de logar

2 respostas
Onelink

O Caso é o seguinte eu tenho um sistema de login que funciona da seguinte maneira.
O usuário preenche os dados na classe FormLogin e clica no botão logar, o Action Event do botão é chamado e a classe Logar é executada.
Na classe logar são executados os seguintes passos:
1-Abertura do arquivo contendo as informações de conexão com o Banco de Dados Mysql.
2-Leitura e salvamento deste conteúdo em uma array de string.
3-Descriptografia desta array utilizando uma classe de criptografia.
4-Conexão ao Banco de Dados Mysql utilizando os dados da array e uma classe de Banco de Dados.
5-Realizar a busca neste Banco de Dados se o usuario e senha digitados batem com o que estão no banco de dados.
6-Se estiver correto, usuário é mandado para outro JPanel sendo a janela principal do software, caso contrario aparece uma mensagem de erro, informando que o login e senha estão incorretos.
O que estão acontecendo é que se eu realizar a mensagem de erro uma vez, a segunda vez que eu clicar no botão Logar, o java da um erro da classe de criptografia que ela já foi inicializada, então eu preciso que de algum modo a chamada ao Action Event do botão logar gere uma nova chamada a classe Logar, e ao terminar de utilizar a mesma, fechar todos os recursos dela.

Os codigos das devidas classes estão abaixo.

//Classe FormLogin
package Login;

//Bibliotecas
import javax.swing.JPanel;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.IOException;

@SuppressWarnings("serial")
public class FormLogin extends JPanel {
	private JTextField tfNome;
	private JPasswordField tfSenha;
	private JFrame base;

	//Construtor
	public FormLogin(JFrame frame) {
		//Definição do JFrame
		base = frame;
		
		//Tamanhos pré-definidos
		setSize(new Dimension(800, 600));
		setPreferredSize(new Dimension(800, 600));
		setMinimumSize(new Dimension(800, 600));
		setMaximumSize(new Dimension(800, 600));
		setLayout(null); //Layout absoluto
		
		JLabel lblNome = new JLabel("Insira o nome do usu\u00E1rio:"); //JLabel e texto.
		lblNome.setBounds(310, 335, 173, 14); //Posição e tamanho do JLabel.
		add(lblNome); //Inserindo ele no JPanel.
		
		tfNome = new JTextField(); //Campo para inserir o nome.
		tfNome.setBounds(310, 361, 173, 20); //Definindo a posição e tamanho do campo.		
		add(tfNome); //Adicionando campo ao JPanel.
		
		tfNome.setColumns(10); //Definindo quantidade de colunas.
		
		JLabel lblSenha = new JLabel("Insira a senha do usu\u00E1rio:"); //JLabel e texto.
		lblSenha.setBounds(310, 392, 173, 14); //Posição e tamanho do JLabel.
		add(lblSenha); //Inserindo ele no JPanel.
		
		tfSenha = new JPasswordField(); //Campo para inserir a senha
		tfSenha.setBounds(310, 417, 173, 20); //Definindo posição e tamanho do campo.
		add(tfSenha); //Adicionando campo ao JPanel.
		
		JButton btnLogar = new JButton("Logar"); //Criando botão de ação e texto.
		btnLogar.setBounds(344, 453, 89, 23); //Definindo local e tamanho dele.
		add(btnLogar); //Adicionando ele ao JPanel.
		
		//Ação do Botão Logar
		btnLogar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					Logar(e);
				} catch (IOException e1) {
					e1.getMessage();
				}
			}
		});
		
		JLabel label = new JLabel(""); //Adicionar um JLabel
		label.setIcon(new ImageIcon("Login.png")); //Definir um icone a ele.
		label.setBounds(269, 78, 261, 246); //Posição e tamanho dele.
		add(label); //Adicionar ao JPanel.
	}
	
	//Ação do botão.
	public void Logar(ActionEvent e) throws IOException {
		@SuppressWarnings("unused")
		Logar logar = new Logar(tfNome.getText(), tfSenha.getPassword(), base);
	}
}
//Classe Login
package Login;

//Bibliotecas
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import Principal.Arquivos;
import Principal.BancoDados;
import Principal.Criptografia;

public class Logar {
	//Construtor
	public Logar(String nome, char[] senha, JFrame frame) throws IOException {
		//Abrir arquivo.
		File arquivo = Arquivos.abrirArquivo("Dados.cad");
		
		//Ler Arquivo.
		String[] texto = Arquivos.lerArquivo(arquivo);
		
		//Descriptografar.
		Criptografia crip = new Criptografia();
		crip.setarSenha("One234");
		int quantidade = texto.length;
		int atual = 0;
		while (atual < quantidade) {
			texto[atual] = texto[atual].replaceFirst("null", "");
			texto[atual] = crip.descriptografar(texto[atual]);
			atual = atual + 1;
		}
		
		//Logar no BD.
		Connection con = BancoDados.conectarBD(texto[0], texto[1], texto[2], texto[3]);
		String query = "SELECT * FROM users WHERE nome = '" + nome + "' AND senha = '" + String.valueOf(senha) + "'";
		ResultSet rs = BancoDados.buscaSQL(query, con);
		
		//Verificar retorno.
		int num = 0;
		try {
			while (rs.next()) {
				num = num + 1;
			}
		} catch (SQLException e) {
			e.getMessage();
		}
		
		//Verificar se login é valido ou não.
		if (num > 0) {
			JOptionPane.showMessageDialog(null, "Login efetuado com sucesso.", "Software", JOptionPane.INFORMATION_MESSAGE);
			frame.setVisible(false);
		} else {
			JOptionPane.showMessageDialog(null, "Falha no login, dados errados.", "Software", JOptionPane.ERROR_MESSAGE);
		}
		
		//Fechar conexão
		BancoDados.fechar(rs, con);
	}
}
//E para ajudar vocês a classe de criptografia onde esta ocorrendo a mensagem de erro.
package Principal;

//Bibliotecas
import org.jasypt.util.text.BasicTextEncryptor;

public class Criptografia {
	//Criando a criptografia.
	static BasicTextEncryptor bte = new BasicTextEncryptor();
	
	//Setar password
	public void setarSenha(String senha) {
		bte.setPassword(senha);
	}
	
	//Criptografar
	public String criptografar(String texto) {
		//Encriptando a string.
		texto = bte.encrypt(texto);
		
		//retorno
		return texto;
	}
	
	//Descriptografar
	public String descriptografar(String texto) {
		//Decriptando a string.
		texto = bte.decrypt(texto);
			
		//retorno
		return texto;
	}
}

//E o erro que ocorre.
Exception in thread "AWT-EventQueue-0" org.jasypt.exceptions.AlreadyInitializedException: Encryption entity already initialized
at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.setPassword(StandardPBEByteEncryptor.java:290)
at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.setPassword(StandardPBEStringEncryptor.java:298)
at org.jasypt.util.text.BasicTextEncryptor.setPassword(BasicTextEncryptor.java:79)
at Principal.Criptografia.setarSenha(Criptografia.java:12)
at Login.Logar.(Logar.java:26)
at Login.FormLogin.Logar(FormLogin.java:76)
at Login.FormLogin$1.actionPerformed(FormLogin.java:60)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Agradeço antecipadamente a atenção de vocês e aguardo retorno.

2 Respostas

al.barbosa

Onelink,

Talvez o problema esteja no fato do BasicTextEncryptor ser declarado como static na classe Criptografia, conforme código abaixo:

static BasicTextEncryptor bte = new BasicTextEncryptor();

Parece que o método setPassword() só pode ser chamado uma vez depois que você inicializa o objeto.
Não conheço esta biblioteca org.jasypt, mas é o que parece pelo erro que você colocou.
Desta forma o atributo bte pertence à classe Criptografia e não ao objeto. Então quando você cria um novo objeto com o código abaixo:

Criptografia crip = new Criptografia();

Não é criado um novo atributo bte, mas é utilizado o mesmo para todos os objetos.
Sugiro experimentar tirar o static do BasicTextEncryptor, ou então pesquisar na biblioteca org.jasypt se a classe BasicTextEncryptor tem métodos para inicializar e finalizar os objetos, e caso possua, utilizá-los.

Onelink

Obrigado al.barbosa eu já tinha notado isto antes e tirei e esta tudo normal agora.
eu já tinha modificado esta classe de static para normal por causa deste problema mesmo mais havia esquecido de retirar o static da chamada da criptografia.

Criado 21 de agosto de 2012
Ultima resposta 21 de ago. de 2012
Respostas 2
Participantes 2