Implementação de Autenticação com Session em Java Servlet

Exemplo de Login com Sessão

Seguindo um fluxo típico de autenticação web, o usuário insere credenciais em uma página de login. Após validação bem-sucedida, a página inicial exibe uma mensagem de boas-vindas personalizada.

Página de Login (login.html)


<html>
<head>
    <meta charset="UTF-8">
    <title>Autenticação</title>
</head>
<body>
    <form action="/CookieSession/LoginServlet" method="post">
        <p>Usuário: <input type="text" name="userName"/></p>
        <p>Senha: <input type="password" name="password"/></p>
        <p><input type="submit" value="Entrar"/></p>
    </form>
</body>
</html>

Página de Falha (fail.html)


<html>
<head>
    <meta charset="UTF-8">
    <title>Falha no Login</title>
</head>
<body>
    <p>Credenciais inválidas. <a href="/CookieSession/login.html">Tente novamente</a></p>
</body>
</html>

Servlet de Autenticação (LoginServlet.java)

package com.gqx.SessionDemo;

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;

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

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        String usuario = req.getParameter("userName");
        String senha = req.getParameter("password");

        if ("gqxing".equals(usuario) && "123456".equals(senha)) {
            // Credenciais válidas: cria sessão e armazena dados
            HttpSession sessao = req.getSession();
            sessao.setAttribute("userName", usuario);
            System.out.println("Autenticação bem-sucedida");
            resp.sendRedirect(req.getContextPath() + "/IndexServlet");
        } else {
            // Falha: redireciona para página de erro
            resp.sendRedirect(req.getContextPath() + "/fail.html");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

Servlet de Boas-Vindas (IndexServlet.java)

package com.gqx.SessionDemo;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

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

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        HttpSession sessao = req.getSession(false);
        
        // Verifica se a sessão existe
        if (sessao == null) {
            resp.sendRedirect(req.getContextPath() + "/login.html");
            return;
        }
        
        String usuario = (String) sessao.getAttribute("userName");
        if (usuario == null) {
            // Caso o atributo tenha sido removido (ex: logout)
            resp.sendRedirect(req.getContextPath() + "/login.html");
            return;
        }
        
        PrintWriter out = resp.getWriter();
        String html = "<html><body>";
        html += "Bem-vindo, " + usuario;
        html += " <a href='" + req.getContextPath() + "/LogoutServlet'>Sair</a>";
        html += "</body></html>";
        out.write(html);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

Servlet de Logout (LogoutServlet.java)

package com.gqx.SessionDemo;

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;

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

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        HttpSession sessao = req.getSession(false);
        if (sessao != null) {
            // Remove apenas o atributo do usuário, mantendo outros dados da sessão
            sessao.removeAttribute("userName");
        }
        resp.sendRedirect(req.getContextPath() + "/login.html");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

Considerações sobre o Uso de Session

Inicialmnete, a implementação utilizava o escopo de requisição (request.setAttribute) com encaminhamento (forward). Essa abordagem exige que todas as páginas usem encaminhamento, o que não é escalável. Ao migrar para o objeto HttpSession, é possível usar redirecionamentos (sendRedirect) normalmente, mantendo os dados do usuário disponíveis entre requisições.

Para logout, não se deve detsruir totalmente a sessão (session.invalidate()) se houver outros dados importantes. A abordagem correta é remover apenas o atributo específico (removeAttribute), preservando o restante do conteúdo da sessão.

Tags: HttpSession Java Servlet jsp autenticacao Logout

Publicado em 7-14 16:24