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.
- 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";
}
}
- 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
}
}
- 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);
}
}