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:
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.
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.
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.
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.