Login_Logout com Servlet e JSP

11 respostas
alexandre.marques

:oops: Boa Tarde, Companheiros tudo bem?

Eu sou iniciante em java, estou com problemas para implementar uma area de login logout na minha aplicação. Eu preciso fazer com que os parametros que vieram da pagina sejam comparados com os dados da tabela do Banco, caso o email e a senha seja igual aos dos parametros, então cria uma sessão, atribui o email do usuario nela e direciona para a pagina home.jsp, Caso os dados não sejam iguais direciona para a pagina de erro.jsp

Eu não estou conseguindo fazer essa comparação, ja tentei de varias formas, li varios post sobre o assunto mais todos tem abordagens diferentes do que eu quero. Caso sintam desconfortaveis para postar um código de exemplo, não tem problema um descritivo, algoritimo, post ja é de grande ajuda.

Obs. Como estrategia eu crieu 2 modelos "Usuarios" que armazenará os parametros e Autor que armazenará os dados do banco, pelo que eu pude perceber não deu certo.

Segue as partes da aplicação:

index.jsp

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Pagina Principal</title>
<link href="./CSS/index_pagina.css" rel="stylesheet" type="text/css" />
</head>
<body id="corpo">
	<div id="formato">
		<form action="mvc" method="post">
			<label id="leb"><strong>E-mail:</strong>
			</label> <input type="text" name="email" id="username" value="" /> <label
				id="leb"><strong>Senha:</strong>
			</label> <input type="password" name="senha" id="password" value="" /> <input
				type="hidden" name="logica" value="LoginLogout" /> <input
				name="entrar" type="submit" id="buttons" value="Entrar" />
		</form>
	</div>
	<div id="logo">
		<img src="./IMG/Planejamento.gif" />
	</div>
	<div id="cadastre_se">
		<a href="cadastro.jsp" target="_blank">Cadastre-se!</a>
	</div>

	<div id="corpo_meio">
		<img src="./IMG/emp.gif" />
	</div>
</body>
</html>

Controle.ControllerServlet

package Controle;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Contratos.Logica;

@WebServlet(description = "Servlet_Controladora", urlPatterns = { "/ControllerServlet" })

public class ControllerServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		
		 String parametro = request.getParameter("logica");
		 String bolaDaVez = "ClassesProjetoLogica." + parametro;
		
		 try {
		      Class<?> classe = Class.forName(bolaDaVez);
		
		      Logica logica = (Logica) classe.newInstance();
		      logica.executa(request, response);
		
	  } catch (Exception e) {
			throw new ServletException("A lógica de negócios causou uma exceção", e);
          }
	
    }

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {	
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {	
	}

}

Classe LoginLogout

package ClassesProjetoLogica;

import java.io.IOException;
import java.sql.Connection;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import AplicBD.Altentic_DAO;
import Contratos.Logica;
import Modelo.Usuarios;

public class LoginLogout implements Logica {

	public void executa(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String email = request.getParameter("email").trim();
		String senha = request.getParameter("senha").trim();
		
		Usuarios usuarios = new Usuarios();
		
		usuarios.setemailUser(email);
		usuarios.setSenhaUser(senha);
		
		Connection connection = (Connection) request.getAttribute("conexao");
		Altentic_DAO altenticar = new Altentic_DAO(connection);
		altenticar.Autenticar(usuarios);
		
		
    }	

}

E a Altentic_DAO

package AplicBD;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import Modelo.Autor;
import Modelo.Usuarios;

public class Altentic_DAO {

	private Connection connection;

	public Altentic_DAO(Connection connection) {
		this.connection = connection;
	}

	public void Autenticar(Usuarios usuarios) {

		try {
			
			PreparedStatement stmt = this.connection
					.prepareStatement("select email, senha from mis_op_usuarios");
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				Autor autor = new Autor();
				autor.setemailUser(rs.getString("email"));
				autor.setSenhaUser(rs.getString("senha"));		
			}
			
			if(rs.next() && usuarios.getemailUser().equalsIgnoreCase(rs.getString("email"))){
				System.out.println("O e-mail que esta no banco é igual o do paramentro");
			}
			
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

}
:?

11 Respostas

heatcold

dificilmente alguem vai ler esse post

alexandre.marques

Porque? Ta faltando alguma coisa?

heatcold

geralmente os posts mais curtos e objetivos são respondidos mais rapidos.
e os grandes como esse, na maioria das vezes não são respondidos

A

Então alexandre ...
vms analizar o codigo ... rsrs
Pelo que eu vi o problema deve está aqui..
Repare que vc fecha o while sem o if lá dentro e esse if tem q verifica todos os registros do banco

while (rs.next()) {  
                Autor autor = new Autor();  
                autor.setemailUser(rs.getString("email"));  
                autor.setSenhaUser(rs.getString("senha"));        
            }  
              
            if(rs.next() && usuarios.getemailUser().equalsIgnoreCase(rs.getString("email"))){  
                System.out.println("O e-mail que esta no banco é igual o do paramentro");  
            }
Teria que fica assim ...
while (rs.next()) {  
                Autor autor = new Autor();  
                autor.setemailUser(rs.getString("email"));  
                autor.setSenhaUser(rs.getString("senha"));        
            
              
            if(rs.next() && usuarios.getemailUser().equalsIgnoreCase(autor.emailUser())){  
                System.out.println("O e-mail que esta no banco é igual o do paramentro");  
            }  
}

tenta assim e vê se dá certo !!

alexandre.marques

heatcold:
geralmente os posts mais curtos e objetivos são respondidos mais rapidos.
e os grandes como esse, na maioria das vezes não são respondidos

alexandre.marques

Olá Alessandra, Tudo Bem?

Eu fiz conforme vc falou e deu certo, porém, eu não estou conseguindo comparar os 2 parametros juntos, emailUser e senhaUser. Existe outra forma de comparar os 2 juntos?

Obrigado pela Atenção :wink:

package AplicBD;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import Modelo.Autor;
import Modelo.Usuarios;

public class Altentic_DAO {

	private Connection connection;

	public Altentic_DAO(Connection connection) {
		this.connection = connection;
	}

	public void Autenticar(Usuarios usuarios) {

		try {

			PreparedStatement stmt = this.connection
					.prepareStatement("select email, senha from mis_op_usuarios");
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				Autor autor = new Autor();

				autor.setemailUser(rs.getString("email"));
				autor.setSenhaUser(rs.getString("senha"));

				if (rs.next()
						&& usuarios.getemailUser().equalsIgnoreCase(
								rs.getString("email"))
						&& (rs.next() && usuarios.getSenhaUser()
								.equalsIgnoreCase(rs.getString("senha")))) {
					System.out.println("Usuario Altorizado!");
				}
			}

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

}
SDFerreira

Cara, acho que teu while deve ficar mais ou menos assim:

while (rs.next()) {  
	Autor autor = new Autor();

	autor.setemailUser(rs.getString("email"));  
	autor.setSenhaUser(rs.getString("senha"));  

	if (usuarios.getemailUser().equalsIgnoreCase(rs.getString("email")) &&
		usuarios.getSenhaUser().equalsIgnoreCase(rs.getString("senha"))) {
		System.out.println("Usuario Altorizado!");  
	}  
}

Dá pra melhorar este código, claro. Por exemplo, tu poderia instanciar um Autor apenas se os dados de login estiverem corretos. Daí o código ficaria assim:

while (rs.next()) {  
	if (usuarios.getemailUser().equalsIgnoreCase(rs.getString("email")) &&
		usuarios.getSenhaUser().equalsIgnoreCase(rs.getString("senha"))) {
	
		Autor autor = new Autor();
		autor.setemailUser(rs.getString("email"));  
		autor.setSenhaUser(rs.getString("senha"));  

		System.out.println("Usuario Altorizado!");  
	}  
}

E dá pra melhorar mais, se tu colocar a comparação dos dados já na consulta SQL. E ela ficaria assim:

PreparedStatement stmt = this.connection  
                    .prepareStatement("SELECT email, senha FROM mis_op_usuarios WHERE email = ? AND senha = ?");
stmt.setString(1, usuarios.getemailUser());
stmt.setString(2, usuarios.getSenhaUser());

Após isso, vem um while (rs.next). Se a consulta retornar um registro, o usuário poderá ser autenticado.

Acho que é por aí.
Abraço.

alexandre.marques

Fala SDFerreira, tudo bem cara?

Valeu pela dica, deu certo, comparando ja na consulta sql, agora ue estou tentando dispara as paginas correspondente caso positivo home.jsp e caso negativo erro.jsp com o

RequestDispatcher rd = request.getRequestDispatcher("/home.jsp");
                  rd.forward(request, response);

eu estou tentando fazer uma condição dentro do if, da uma olhoda...

package AplicBD;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.RequestDispatcher;
import Modelo.Autor;
import Modelo.Usuarios;

public class Altentic_DAO {

	private Connection connection;

	public Altentic_DAO(Connection connection) {
		this.connection = connection;
	}

	public void Autenticar(Usuarios usuarios) {

		try {

			PreparedStatement stmt = this.connection
					.prepareStatement("select email, senha from mis_op_usuarios where email = ? and senha = ?");

			stmt.setString(1, usuarios.getemailUser());
			stmt.setString(2, usuarios.getSenhaUser());

			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				
				if (usuarios.getemailUser().equalsIgnoreCase(
						   rs.getString("email"))
						&& usuarios.getSenhaUser().equalsIgnoreCase(
								rs.getString("senha"))) {
					
					Autor autor = new Autor();

					autor.setemailUser(rs.getString("email"));
					autor.setSenhaUser(rs.getString("senha"));

					System.out.println("Usuario Altorizado!");
					
					RequestDispatcher rd = request.getRequestDispatcher("/home.jsp");
					rd.forward(request, response);

				}else{
					
					System.out.println("Usuario não Altorizado!");
					
					RequestDispatcher rd = request.getRequestDispatcher("/erro.jsp");
					rd.forward(request, response);
					
				}
				
			}

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

}
SDFerreira

Dae. Que bom que deu certo.

Só não consegui entender direito se tu está com algum problema no redirecionamento.

O que está acontecendo?

alexandre.marques

Na verdade eu não estou conseguindo montar uma lógica para o direcionamento, entendeu?
quando o e-mail e a senha são iguais ao do banco o usuario é altorizado, ai eu estou tentando direciona-lo para a pagina home.jsp
se os dados não corresponderem direciona para a pagina erro.jsp

desse jeito não está rolando, esta dando erro no request.getRequestDispatcher, pede para criar a variavel local, e nessa classe (DAO) eu não tenho um metodo HttpServlet.

while (rs.next()) {  
                  
                if (usuarios.getemailUser().equalsIgnoreCase(  
                           rs.getString("email"))  
                        && usuarios.getSenhaUser().equalsIgnoreCase(  
                                rs.getString("senha"))) {  
                      
                    Autor autor = new Autor();  
  
                    autor.setemailUser(rs.getString("email"));  
                    autor.setSenhaUser(rs.getString("senha"));  
  
                    System.out.println("Usuario Altorizado!");  
                      
                    RequestDispatcher rd = request.getRequestDispatcher("/home.jsp");  
                    rd.forward(request, response);  
  
                }else{  
                      
                    System.out.println("Usuario não Altorizado!");  
                      
                    RequestDispatcher rd = request.getRequestDispatcher("/erro.jsp");  
                    rd.forward(request, response);  
                      
                }  
                  
            }
SDFerreira

Entendi.

Bom, considerando o código que tu já tem escrito, essa responsabilidade de redirecionar páginas não precisa (e, talvez, nem deveria) ficar na classe Altentic_DAO. Uma das coisas que tu poderia fazer é alterar o método Autenticar, dessa classe. Ele poderia retornar um boolean. Esse valor, seria retornado pra classe LoginLogout, dentro do método executa (que é onde tu está instanciando a Altentic_DAO). Daí sim, dentro da classe LoginLogout, que tem um objeto HttpServletRequest, tu pode fazer o redirecionamento, dependendo do valor retornado pelo método Autenticar. Sacou?

Abraço e bom estudo.

Criado 17 de fevereiro de 2012
Ultima resposta 21 de fev. de 2012
Respostas 11
Participantes 4