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.