Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Metodo de login e servlet

Bom dia,

estou com uma duvida, estou repetindo código em meu método de login no banco:

public Agentes login(String login, String senha) throws SQLException {

        Connection con = ConecctionMySql.getConnection();

        PreparedStatement stmt = con.prepareStatement("select * from agentes ");

        ResultSet rs = stmt.executeQuery();


        Agentes agentes = new Agentes();    
        while (rs.next()) {

            if (rs.getString("senha").equals(senha)) {                
                System.out.println("Usuário cadastrado: " + login);
                return agentes;
            }
            else{
                System.out.println("Usuário não existe");
                return agentes;
            }
        }
        return agentes;
    }

nesse método eu faço a verificação dos dados no meu banco de dados e me volta o usuário, e tenho minha servlet de login:

@WebServlet(urlPatterns = "/login")
public class Login extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        String senha = req.getParameter("senha");
        String email = req.getParameter("email");

        AgentesDao dao = new AgentesDao();

        try {
            PrintWriter writer = resp.getWriter();
            Agentes agentes = dao.login(email, senha);            
            if (agentes == null){
                writer.println("<html><body>Usuario não existe</body></html>");
            }else { 
                writer.println("<html><body>Usuario logado: </body></html>");
            }


        } catch (SQLException e) {
            e.printStackTrace();
        }


    }
}

eu vou ter que validar de novo o usuário na minha Servlet acho que não faz muito sentido isso, existe alguma forma de enviar para Servlet a resposta correta?

muito obrigado.

4 respostas

Fala Gabriel, tudo bem ?

Depois de encontrar o usuário e validar o login, na servlet, você poderia colocar o usuário na Sessão criada para as requisições do seu cliente.

HttpSession session = request.getSession();
session.setAttribute("usuarioLogado", usuario);

Como esse sessão dura por todos os requests do cliente que está conversando com seu servidor (a menos que o timeout seja alcançado entre as requisições) você não precisará ficar validando novamente o usuário a cada chamada. Basta pegar a sessão (.getSession()) e verificar se tem usuário logado (.getAttribute("usuarioLogado")).

Dicas: Tente usar um JSP ao invés de escrever html dentro da servlet. Planeje sua query no banco de dados pra já trazer apenas o registro do usuário de login xyz (select * from agentes a where a.email = ?). Assim evita trazer todos os registros e procurar entre todos uma senha. Aliás o que impede de dois usuarios diferentes terem a mesma senha ? Dessa maneira poderia autenticar o usuário errado. O email do usuario deve ser levado em consideração para trazer o registro correto, e somente depois disso sua senha deve ser verificada.

Outra coisa. O objeto de agentes está sendo retornado sem dados. Informações de email e senha estão nulas. Tome cuidado quanto a isso.

Espero ter ajudado. Abraço!

Rafael Boa tarde,

a query modificada :

PreparedStatement stmt = con.prepareStatement("select * from agentes where login = ?");

ela cuidaria apenas de usuários existente no meu banco certo? e os que não existem como vou tratar isso,

Aliás o que impede de dois usuarios diferentes terem a mesma senha ? R: realmente nada impede de terem senhas iguais, minha intenção e de fazer um método para alterar e não vou ter controle disso.

quanto ao levar o email em consideração voce fala para alterar o metodo de verificação?

if (rs.getString("senha").equals(senha)&& rs.getString("login").equals(login)) {
                System.out.println("usuario cadastrado: " + login);
                return agentes;
            }
            else{
                System.out.println("usuario nao existe");
                return agentes;
            }

ficaria mais ou menos assim?

quantos as Jsp vou fazer sim, é que como estou seguindo o cronograma do curso, ele ainda não chegou nessa parte.

Outra coisa. O objeto de agentes está sendo retornado sem dados. Informações de email e senha estão nulas. Tome cuidado quanto a isso. R: ou seja quando ele achar algum usuário, eu tenho que setar as informações no usuário? parecido com isso ?

if (rs.getString("senha").equals(senha)&& rs.getString("login").equals(login)) {
                System.out.println("usuario cadastrado: " + login);
                agentes.setLogin(login);
                agentes.setSenha(senha);
                return agentes;
            }
            else{
                System.out.println("usuario nao existe");
                return agentes;
            }
        }
        return agentes;

só uma duvida que nao entendi desculpe, voce fala que depois de eu validar o usuario na servlet, eu atribuo a ele uma sessão mas essa validação tambem nao vai existir quando eu fizer a query no banco ?

if (rs.getString("senha").equals(senha)&& rs.getString("login").equals(login)) {

Rafael muito obrigado pela atenção.

solução

Fala Gabriel, tudo bem ?

De nada! Juntos aqui no fórum a gente se ajuda e todo mundo aprende =)

Sobre o que comentei antes ... Se você faz a consulta trazendo todos os registros (select * from agentes) além da query ficar mais pesada pois no ResultSet conterão todos os registros da tabela, existe a possibilidade de ter dois usuários (emails diferentes) com senhas iguais, ai tem o risco do primeiro a ser encontrado no if não ser o usuário certo que deseja se autenticar.

A ideia é que o email é levado em consideração apenas por estar no where do da query. O banco só vai retornar um único registro (já que o email é único) e somente nesse registro que você vai conferir a senha. Caso não exista usuário, sem problemas, o método next() do ResultSet retorna falso e você devolve alguma Exception que será tratada, por exemplo, mandando uma mensagem de que o usuário não existe.

Você pode inclusive, nessas condições, usar um if ao invés do while o que mostra justamente a busca por um único registro. Algo como:

if (rs.next()) {
    if (rs.getString("senha").equals(senha)) {
        Agente agente = new Agente();
        agente.setEmail(email);
        agente.setSenha(senha); // cuidado em manter a senha no objeto
        //prefira usar uma forma de criptografia pra armazenar no banco e manter a informação em memória
    }
    else{
        throw new RuntimeException("Senha inválida!");
    }
}
//se passou pelo `if` não tem nada no RS, entao não existe esse usuário na base
throw new RuntimeException("O usuário não existe");

Se preferir pode até criar uma Exception mais adequada para a questão como uma LoginException, por exemplo. Você trata a possibilidade de receber essa exception fora, e no caso de ela acontecer poderia mandar para a página de login novamente, mandando até alguma mensagem de erro.

Espero ter ajudado. Abraço!

brigado Rafael