Desenvolvimento de um Sistema de Autenticação com Arquitetura Multicamadas em Java

A separação de respnosabilidades através da arquitetura em três camadas (ou multicamadas) é um padrão fundamental no desenvolvimento de aplicações corporativas Java. Este modelo divide o sistema em componentes distintos: Apresentação (View), Controle (Controller), Lógica de Negócios/Persistência (DAO) e Etnidades (Model), o que facilita a manutenção, os testes e a escalabilidade do código.

Camada de Antidade (Model)

A camada de entidade é composta por objetos Java simples (POJOs) que encapsulam os dados do domínio da aplicação. Abaixo, definimos a classe que representa as credenciais do usuário, substituindo a nomenclatura original por atributos mais semânticos.

package com.empresa.modelo;

public class Usuario {
    private Long id;
    private String login;
    private String senha;

    public Usuario() {
    }

    public Usuario(String login, String senha) {
        this.login = login;
        this.senha = senha;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }
}

Camada de Acesso a Dados (DAO)

O Data Access Object (DAO) centraliza a comunicação com o banco de dados. Nesta refatoração, a lógica foi aprimorada para utilizar o padrão try-with-resources, garantindo o fechamento automático das conexões JDBC. Além disso, o método de validação agora retorna um valor booleano, eliminando a necessidade de manipular códigos de erro inteiros (como -1, 0 e 1).

package com.empresa.persistencia;

import com.empresa.modelo.Usuario;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UsuarioDao {
    
    private static final String DB_URL = "jdbc:mysql://localhost:3306/sistema_db?serverTimezone=UTC&useSSL=false";
    private static final String DB_USER = "admin";
    private static final String DB_PASS = "senha_segura";

    public boolean autenticar(Usuario usuario) {
        String sql = "SELECT COUNT(1) FROM usuarios WHERE login = ? AND senha = ?";

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            
            try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
                 PreparedStatement stmt = conn.prepareStatement(sql)) {
                 
                stmt.setString(1, usuario.getLogin());
                stmt.setString(2, usuario.getSenha());

                try (ResultSet rs = stmt.executeQuery()) {
                    if (rs.next()) {
                        return rs.getInt(1) > 0;
                    }
                }
            }
        } catch (ClassNotFoundException | SQLException e) {
            System.err.println("Erro na camada de persistência: " + e.getMessage());
        }
        return false;
    }
}

Camada de Controle (Controller)

O Servlet atua como o controlador da aplicação. Ele intercepta as requisições HTTP, extrai os parâmetros enviados pelo cliente, invoca a camada de persistência e roteia o fluxo de resposta. Note que o método doPost é o padrão adequado para processamento de formulários de login, em vez de delegar a requisição para o doGet.

package com.empresa.controle;

import com.empresa.modelo.Usuario;
import com.empresa.persistencia.UsuarioDao;
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 java.io.IOException;

@WebServlet("/autenticar")
public class AutenticacaoServlet extends HttpServlet {

    private final UsuarioDao usuarioDao = new UsuarioDao();

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        
        request.setCharacterEncoding("UTF-8");
        
        String loginParam = request.getParameter("txtLogin");
        String senhaParam = request.getParameter("txtSenha");

        Usuario usuario = new Usuario(loginParam, senhaParam);
        boolean acessoPermitido = usuarioDao.autenticar(usuario);

        if (acessoPermitido) {
            request.getRequestDispatcher("/dashboard.jsp").forward(request, response);
        } else {
            request.setAttribute("mensagemErro", "Credenciais inválidas. Tente novamente.");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }
    }
}

Camada de Apresentação (View)

As páginas JSP compõem a interface visual. O formulário principal captura as informações e as envia ao Servlet configurado. Uma lógica adicional foi inserida para exibir mensagens de erro de autenticação quando o redirecionamento ocorre após uma falha.

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Acesso ao Sistema</title>
</head>
<body>
    <h2>Painel de Login</h2>
    
    <% if (request.getAttribute("mensagemErro") != null) { %>
        <p style="color: red;"><%= request.getAttribute("mensagemErro") %></p>
    <% } %>
    
    <form action="autenticar" method="post">
        <label for="login">Usuário:</label><br>
        <input type="text" id="login" name="txtLogin" required><br><br>
        
        <label for="senha">Senha:</label><br>
        <input type="password" id="senha" name="txtSenha" required><br><br>
        
        <button type="submit">Entrar</button>
    </form>
</body>
</html>

dashboard.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Área Restrita</title>
</head>
<body>
    <h1>Bem-vindo ao Sistema!</h1>
    <p>Sua autenticação foi processada com sucesso e você acessou a área segura.</p>
</body>
</html>

Tags: Java EE jsp Servlets jdbc Arquitetura Multicamadas

Publicado em 7-20 05:59