java - Tela de Login - Duvida
Perguntas � java � Tela de Login - Duvida
Tela de Login - Duvida
Bom dia, eu criei uma tela de login, porém o que acontece é que ele só valida o primeiro usuário cadastrado no Banco de Dados. Se eu insiro um segundo ou mais usuários pra acessar o sistema, ele só deixa logar o primeiro cadastrado no banco de dados. Segue o código que esta no meu botão de "Acessar o sistema", se alguém puder ajudar agradeço.
cnx.stm = cnx.con.createStatement();
String SQL = "Select * From login" ;
cnx.rs.first();
if (jNome.getText().equals(cnx.rs.getString("nome")) && jSenha.getText().equals(cnx.rs.getString("senha"))) {
cad.setVisible(true);
JOptionPane.showMessageDialog(null,"Login ou Senha Inválido");
Obs: Na linda que está: cnx.rs.first(); eu ja alterei para: cnx.rs.next(); e NÃO FUNCIONOU.
O que está acontecendo é que você não está navegando nos registros para fazer a comparação dos parâmetros passados, ou seja, ele só está comparando o primeiro registro quando você acionou "cnx.rs.first()", posicionando o ponteiro numa estrutura anterior ao primeiro registro, e neste caso não deveria nem encontrar ou primeiro registro. Caso você acione "cnx.rs.next()" ai sim ele vai para o primeiro registro, mas permanece ali enquanto você não acionar de novo cnx.rs.next() neste seu código deveria usar um loop "while" assim.
while (cnx.rs.next()){
if (jNome.getText().equals(cnx.rs.getString("nome")) && jSenha.getText().equals(cnx.rs.getString("senha"))){
break;  // Pare o loop tão logo o registro seja encontrado
if (cnx.rs.last()){
Repare que coloquei a mensagem de login ou senha inválido fora do loop while, isto porque para não parar a navegação logo no primeiro registro que não coincida com os parâmetros passados.
Entretanto devo alertá-lo que fazer uma navegação sequencial na tabela Login, não seria o ideal, visto que, imagine se o seu cadastro de usuários contivesse mais de 1.000 registros, isso poderia causar uma certa lentidão no seu sistema logo ao se autenticar, assim sendo o ideal e você fazer uma consulta SQL passando como parâmetros os dados captados nos JTexts, mais ou menos assim.
String SQL = "Select * From login Where nome = "+jNome.getText()+" and senha = "+jSenha.getText();
if (cnx.rs.next()){
Podes crer que este último código lhe trará um resultado mais benéfico, com o código mais enxuto, e muito mais rápido.
Aproveitando o gancho de dicas, esse na verdade é o tipo de verificação de login que eu nunca faria, principalmente por manter a senha do usuário salva integralmente no BD, dá um tapa nesse código ai brother, usa um hash dá uma encripitada com padrão que lhe agradar ou cria um, mas assim fica muito tosco mano.
— Ferrete 04 de fev de 2015
de forma bem simples algo assim já ficaria mais legal : select senha from blá where user = :user (se não retornar nada o usuário digitado não existe) e compara a senha do banco com a digitada (de preferência criptografada direto da view só pra comparar os hashs ou sei lá)
Muito obrigado galera por todas as respostas e dicas, o sistema esta funcionando corretamente agora agradeço muito. Um grande abraço a todos!!!
— Emerson Gracindo dos Santos 05 de fev de 2015
O Codigo esta conforme abaixo porém agora ele percorre o sistema de BD mas ao mesmo tempo informa que o usuário esta invalido. Tem algum detalhe que ainda esta errado, desculpa sou iniciante em java por isto a dúvida.
//PreparedStatement st = cnx.st.PreparedStatement("Select * From login Where nome= ? And senha= ?");
//cnx.rs.first();
jNome.setText(null);
jSenha.setText(null);
jNome.requestFocus();
Tente mudar o Loop While desta forma.
} else if (cnx.rs.last()) {
Ainda assim eu insisto que você faça a procura dentro da instrução SQL, no meu segundo código do meu primeiro post, como eu disse além do código ser mais enxuto, ele muito mais rápido do que uma busca sequencial.