19 Modifikation von HTTP-Requests mit Filtern und Interceptors in Spring

Sowohl Filter als auch Interceptors bieten in Spring mächtige Mechanismen, um HTTP-Requests zu inspizieren und zu manipulieren, bevor sie von einem Controller verarbeitet werden. Hier sind einige Beispiele, wie diese verwendet werden können:

19.1 Beispiel für einen Filter

Filter agieren auf einer niedrigeren Ebene und sind in der Servlet-Spezifikation definiert. Sie eignen sich gut, um Requests und Responses zu modifizieren oder um allgemeine Logging- und Sicherheitsfeatures zu implementieren.

19.1.1 Logging-Filter

Ein einfacher Filter, der jede Anfrage loggt, bevor sie den DispatcherServlet erreicht:

@Component
public class LoggingFilter implements Filter {

    private static final Logger LOG = LoggerFactory.getLogger(LoggingFilter.class);

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        LOG.info("Incoming request {} : {}", req.getMethod(), req.getRequestURI());
        
        // Fortsetzung der Filterkette
        chain.doFilter(request, response);
        
        // Nachfolgende Aktionen nach der Controller-Verarbeitung
        LOG.info("Outgoing response for {} : {}", req.getMethod(), req.getRequestURI());
    }
}

Dieser Filter loggt die Methode und URI jeder eingehenden HTTP-Anfrage.

19.2 Beispiel für einen Interceptor

Interceptors bieten mehr Kontrolle und Flexibilität als Filter, da sie spezifisch für das Spring Framework sind. Sie können vor und nach der Controller-Verarbeitung sowie nach dem Rendering der View (falls vorhanden) ausführen.

19.2.1 Modifikations-Interceptor

Ein Interceptor, der bestimmte Header in den Request einfügt, bevor er vom Controller verarbeitet wird:

@Component
public class ModifyingInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // Fügt einen benutzerdefinierten Header hinzu
        request.setAttribute("CustomHeader", "Wert");
        return true; // Fortsetzung der Verarbeitung
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        // Aktionen nach der Controller-Verarbeitung
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // Aktionen nach dem Rendern der View
    }
}

Und die Registrierung des Interceptors in der Konfiguration:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    ModifyingInterceptor modifyingInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(modifyingInterceptor);
    }
}

Dieser Interceptor fügt jedem Request einen zusätzlichen Header hinzu, bevor er vom Controller bearbeitet wird.