Login com JSP/servlets + PostgreSQL – Parte 2

Dando sequência ao exemplo de Login com JSP/Servlets, neste post veremos o restante do conteúdo, bem como uma aplicação de exemplo que contém os arquivos utilizados neste post.
Para esta segunda parte, é necessário que o usuário conheça o básico de HTML, servlets e JSP. Será visto também algumas custom tags de JSTL.

8# Criar o Servlet de validação do usuário
O próximo passo é criar um servlet que irá validar se o usuário existe ou não no Banco de Dados, através da classe DAO. Em uma arquitetura MVC, este Servlet seria o Controller. Abaixo, o código do mesmo:

package login;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import model.bean.Usuario;
import model.dao.DaoUsuario;

/**
 *
 * @author hallan medeiros
 *
 */
public class ServletValidaLogin extends HttpServlet {

	private static final long serialVersionUID = 7633293501883840556L;

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

		HttpSession session = request.getSession(); //obtem a sessao do usuario, caso exista

		Usuario user = null;
		String login_form = request.getParameter("username"); // Pega o Login vindo do formulario
		String senha_form = request.getParameter("password"); //Pega a senha vinda do formulario

		try {
			DaoUsuario dao = new DaoUsuario(); //cria uma instancia do DAO usuario
			user = dao.getUsuario(login_form, senha_form);
		}
		catch ( Exception e ){

		}

		//se nao encontrou usuario no banco, redireciona para a pagina de erro!
		if ( user == null ) {
			session.invalidate();
			request.getRequestDispatcher("erroLogin.jsp" ).forward(request, response);
		}
		else{
			//se o dao retornar um usuario, coloca o mesmo na sessao
			session.setAttribute("user", user);
			request.getRequestDispatcher("logado.jsp" ).forward(request, response);
		}

	}

}

Este servlet busca um usuário no banco de dados de acordo com os dados informados. Caso encontre, o mesmo cria um objeto usuário e coloca o mesmo na sessão, e encaminha a requisição para a página de logado (que ainda vamos criar). Caso não encontre, invalida qualquer sessão existente e encaminha a requisição para uma página de erro.

9# Registrar o Servlet no web.xml
Com o servlet pronto, o próximo passo então é registrar este servlet no web.xml:

<servlet>
    <servlet-name>processaLogin</servlet-name>
    <servlet-class> login.ServletValidaLogin </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>processaLogin</servlet-name>
    <url-pattern> /validaLogin.do </url-pattern>
</servlet-mapping>

10# Criar a página de Login
Agora, devemos criar a página de login. O ‘action’ do nosso formulário será o servlet mapeado no web.xml. Como no servlet sobrescrevemos o método doPost(), então a forma de envio dos dados será ‘POST’, conforme abaixo:

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!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=UTF-8" />
<title>Login</title>
</head>
<body>

<form method="post" action="validaLogin.do">
<table>
	<tr>
		<td>Usuário</td>
		<td><input type="text" name="username" /></td>
	</tr>
	<tr>
		<td>Senha</td>
		<td><input type="password" name="password" /></td>
	</tr>
	<tr>
		<td><input type="submit" value="Login" /></td>
	</tr>
</table>

</form>

</body>
</html>

11# Criar a página de usuário logado
Para finalizar, devemos criar a página que será visualizada apenas pelos usuários que estão logados no sistema. Caso o mesmo não esteja logado, será redirecionado para uma página de erro. Abaixo o código:

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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=UTF-8" />
<title>Logado</title>
</head>
<body>

<c:choose>
	<c:when test="${ user eq null }">
		<jsp:forward page="erroLogin.jsp" />
	</c:when>
	<c:otherwise>
		<p>Bem-vindo ${ user.nome }</p>
	</c:otherwise>

</c:choose>
</body>
</html>

Como não é uma boa prática a utilização de scriptlets (códigos java dentro de jsps), utilizamos tags de jsp e JSTL para validação de usuário e redirecionamento em caso de alguém acessar esta pagina sem estar logado.

O código no cabeçalho indica que iremos utilizar a JSTL nesta página, com o prefixo ‘c’:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

Caso exista um usuário na sessão atual, irá ser exibida uma mensagem de bem-vindo, com seu nome.
Para esta validação foi utilizada as tags JSTL choose, when e otherwise, que funcionam como um IF/ELSE. A tag jsp:forward faz um encaminhamento para a página passada pelo atributo page, mas o mesmo somente será executado se o test da tag when for verdadeiro, ou seja, se não houver um atributo user em nenhum dos quatro escopos da aplicação (request, session, page e context).

Bom, finalizamos então este tutorial de login/senha com JSP/Servlets. Como eu disse anteriormente, o mesmo é bem simples, mas pode servir de base para quem está começando com java web.

O projeto do Eclipse contendo os passos e arquivos deste tutorial pode ser baixado aqui.

Existe uma outra forma mais interessante de efetuar controle de login./senha com java: com JAAS (Java Authentication and Authorization Service). Com JAAS, o controle é feito de forma declarativa (em xml), sem necessidade de verificação em todas as páginas – porém exige um pouco mais de conhecimento de como funciona o java para web. Em um outro post farei um tutorial “de 5 segundos” de como configurar e utilizar o JAAS.

Espero ter ajudado!

Abraço!

Deixe um Comentário

17 Comentários.

  1. Muito bom! Esse “beeem básico” é essencial para iniciantes.
    O post está muito bem escrito e você está de parabéns!

  2. Opa!

    Muito bom o post!

  3. Parabéns, foi muito claro e conciso o que você passou!
    Obrigado e sucesso!

  4. Ótimo tutorial, muito bem explicado, ficou 10 mesmo.
    Pra quem está iniciando [como eu] ficou muito bom.

  5. Muito obrigado, finalmente achei um post que me ajudou de verdade. Sei que seu post é antigo, mas continua atual. Gostaria muito de saber (olha só, quem manda mostrar as coisas com categoria!). Como fazer para, no caso de o logado ser Administrador (por exemplo), ele ser direcionada para página admin.jsp e visitante para página visita.jsp. Pode indicar onde encontro algo assim? Valeu! Muito obrigado mesmo.

  6. hallan, boa tarde.
    Estou com problemas para usar o . Onde eu encontro o arquivo c.tld??? peguei seu zip do projeto e não tem lá. Estou com eclipse + tomcat 7.0.12. Coloquei jstl.jar e standard.jar no lib do WEB-INF do projeto e nada. Vc pode me ajudar???

    • A tag library “c” está dentro do standard.jar.
      Se não está funcionando, você não fez o import da forma correta.

      O projeto é completamente funcional e é para ser importado para dentro do eclipse.

      Tente usar o Tomcat 6. A versão 7 é recente e pode ter algumas configurações diferentes da 6.

      Att

  7. Hallan na hora de baixar o arquivo esta constando como corrompido e com erro, teria como vc disponibilizar novamente.

  8. Otimo post. mas me tira uma duvida:
    Como seria para finalizar a sessão?
    Ex.: Botão de Logout.

    Agradeço

    Joathan F.

    • Boa tarde Joathan,

      Para finalizar a sessão, deve haver outro Servlet, onde deve invalidar a sessão através do comando:

      HttpSession session = request.getSession();
      session.invalidate();

      O botão de logout deve encaminhar o usuário para a URL deste servlet.
      Por fim, após finalizar a sessão, este servlet pode encaminhar o usuário, por exemplo, para a tela de login.

      Um abraço

  9. Ola
    Vc poderia definir o nivel de segurança dessas sessions? Quero dizer, ate onde isso eh seguro?

    Obrigado

  10. Caro colega, vendo seu tutorial achei muito interessante, porém quando mando rodar na tela de loign insero os dados, da um erro no validaLogin.do., pode ajudar porque desse erro?
    Obrigado.
    gusmborge

  11. Opa, boa tarde, antes de tudo gostaria de agradecer pelo tutorial que tá muito bem explicado e funcional mais eu gostaria de saber se fosse possível do seguinte: o usuário fez o login normal e foi pra página de logado mais agora eu quero q ele clicando num link de outra jsp ele fique logado, nessa outra, a sessão se perde, tem como você me explicar como resolver isso??Obrigado.

  12. Sensacional, estou começando a aprender Java EE por conta. Fiquei horas tentando desvendar a melhor forma de trabalhar com MVC e o seu exemplo simplesmente foi perfeito pois comecei com a validação da tela de login, bateu certinho.
    Muito Obrigado por divulgar o material. Grande abraço.

  13. Muito bom o post, me ajudou bastante! força aí!!!

  14. 😛 — Parabéns pelo Post man, ajudou bastante a entender de forma clara e simples essa iniciação de java web, e deu pra conciliar tranquilamente com oracle, e as outras camadas do java como a BO, etc… Valeu

  15. Meus parabéns!
    Não consigo baixar o .zip poderia me disponibilizar?

Deixe um Comentário


NOTA - Você pode usar estesHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>