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>