Implementação de Interceptadores de Requisição no Spring Boot

Visão Geral dos Interceptadores

No ecossistema Spring MVC, os interceptadores são componentes essenciais para aplicar lógica transversal, como autenticação, logging ou auditoria, antes que a requisição alcance o controlador ou após a resposta ser gerada. Para implementar essa funcionalidade, é necessário seguir uma estrutura padrão envolvendo a criação do componente, sua lógica de negócio e o registro no contexto da aplicação.

  1. Definição do Controlador

O primeiro passo consiste em estabelecer as rotas que serão protegidas ou monitoradas. Abaixo, exemplifica-se um controlador que gerencia acesso a áreas privadas e públicas.

package com.example.application.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {

    @GetMapping("/api/private/dashboard")
    @ResponseBody
    public String accessDashboard() {
        return "Acesso permitido ao painel privado";
    }

    @GetMapping("/api/auth/signin")
    public String performLogin(Model model, @PathVariable String user) {
        model.addAttribute("currentUser", user);
        return "welcome_page";
    }
}
  1. Implementação da Lógica de Interceptação

A classe de interceptação deve implementar a interface HandlerInterceptor. O método preHandle é executado antes do controlador, permitindo validar sessões ou tokens. Se retornar false, a cadeia de execução é interrompida.

package com.example.application.security;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SecurityInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(false);
        boolean isAuthenticated = (session != null && session.getAttribute("userId") != null);

        if (!isAuthenticated) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            response.getWriter().write("Acesso negado: Usuário não autenticado");
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // Lógica opcional após a execução do controller, antes da renderização da view
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // Lógica opcional após a completa finalização da requisição
    }
}
  1. Rgeistro e Configuração

Para que o Spring reconheça o interceptador, é necesário registrá-lo em uma classe de configuração que implemente WebMvcConfigurer. Nesta etapa, definimos quais padrões de URL serão interceptados e quais estarão excluídos, como rotas de autenticação.

package com.example.application.config;

import com.example.application.security.SecurityInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    private static final String[] PROTECTED_ROUTES = {"/api/private/**"};
    private static final String[] PUBLIC_ROUTES = {"/api/auth/**", "/public/**"};

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SecurityInterceptor())
                .addPathPatterns(PROTECTED_ROUTES)
                .excludePathPatterns(PUBLIC_ROUTES);
    }
}

Tags: spring-boot handler-interceptor webmvc java spring-mvc

Publicado em 10-13 08:23