Implementando Logout e Protegendo o Acesso à Página Principal

Este artigo detalha a implementação de uma funcionalidade de logout e a proteção subsequente do acesso direto à página principle após o logout.

Implementação do Servlet de Logout

Para gerenciar o processo de logout, um servlet dedicado é criado. Este servlet é responsável por invalidar a sessão do usuário e redirecioná-lo para a página de login.


package com.example.servlets;

import com.example.utils.SessionConstants;

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

public class UserLogoutServlet extends HttpServlet {

   private static final long serialVersionUID = 1L; // Identificador de serialização

   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       // Remove o atributo do usuário da sessão
       request.getSession().removeAttribute(SessionConstants.USER_ATTRIBUTE);
       // Redireciona o usuário para a página de login
       response.sendRedirect(request.getContextPath() + "/login.jsp");
   }

   @Override
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       // Delega a requisição POST para o método doGet
       doGet(request, response);
   }
}
   

Filtro de Proteção de Acesso

Um filtro é empregado para interceptar requisições e garantir que apenas usuários autenticados possam acessar certas áreas da aplicação, como a página principal. Se um usuário não estiver atuenticado, ele será redirecionado para uma página de erro.


package com.example.filters;

import com.example.model.UserProfile;
import com.example.utils.SessionConstants;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class AccessControlFilter implements Filter {

   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
       // Inicialização do filtro, se necessário
   }

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
       throws IOException, ServletException {
       HttpServletRequest httpRequest = (HttpServletRequest) request;
       HttpServletResponse httpResponse = (HttpServletResponse) response;

       // Verifica se o usuário está na sessão
       UserProfile user = (UserProfile) httpRequest.getSession().getAttribute(SessionConstants.USER_ATTRIBUTE);

       if (user == null) {
           // Se o usuário não estiver autenticado, redireciona para a página de erro
           httpResponse.sendRedirect(httpRequest.getContextPath() + "/access_denied.jsp");
       } else {
           // Se autenticado, continua a cadeia de filtros/servlets
           chain.doFilter(httpRequest, httpResponse);
       }
   }

   @Override
   public void destroy() {
       // Limpeza do filtro, se necessário
   }
}
   

Configuração no web.xml

O arquivo web.xml é atualizado para registrar o servlet de logout e o filtro de controle de acesso. O filtro é configurado para interceptar requisições destinadas ao diretório /protected/*.


<!-- Configuração do Filtro de Controle de Acesso -->
<filter>
   <filter-name>AccessControlFilter</filter-name>
   <filter-class>com.example.filters.AccessControlFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>AccessControlFilter</filter-name>
   <url-pattern>/protected/*</url-pattern>
</filter-mapping>

<!-- Configuração do Servlet de Logout -->
<servlet>
   <servlet-name>logoutService</servlet-name>
   <servlet-class>com.example.servlets.UserLogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>logoutService</servlet-name>
   <url-pattern>/protected/logout.do</url-pattern>
</servlet-mapping>
   

Tags: java servlet Filter jsp web security

Publicado em 7-20 04:11