Wie definiere ich einen Spring Boot Filter?

1. Übersicht

In diesem kurzen Tutorial erfahren Sie, wie Sie mithilfe von Spring Boot benutzerdefinierte Filter definieren und deren Aufrufreihenfolge festlegen.

2. Filter und Aufrufreihenfolge definieren

Beginnen wir mit der Erstellung von zwei Filtern:

  1. TransactionFilter - zum Starten und Festschreiben von Transaktionen
  2. RequestResponseLoggingFilter - zum Protokollieren von Anforderungen und Antworten

Um einen Filter zu erstellen, müssen wir einfach die Umsetzung Filter - Schnittstelle:

@Component @Order(1) public class TransactionFilter implements Filter { @Override public void doFilter ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request;         LOG.info( "Starting a transaction for req : {}", req.getRequestURI());         chain.doFilter(request, response);         LOG.info( "Committing a transaction for req : {}", req.getRequestURI()); } // other methods } 
@Component @Order(2) public class RequestResponseLoggingFilter implements Filter { @Override public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; LOG.info( "Logging Request {} : {}", req.getMethod(), req.getRequestURI()); chain.doFilter(request, response); LOG.info( "Logging Response :{}", res.getContentType()); } // other methods } 

Damit Spring einen Filter erkennen kann, müssen wir ihn als Bean mit der Annotation @Component definieren .

Und damit die Filter in der richtigen Reihenfolge ausgelöst werden, mussten wir die Annotation @Order verwenden .

2.1. Mit URL-Muster filtern

Im obigen Beispiel sind unsere Filter standardmäßig für alle URLs in unserer Anwendung registriert. Manchmal möchten wir jedoch, dass ein Filter nur auf bestimmte URL-Muster angewendet wird.

In diesem Fall müssen wir die Annotation @Component aus der Filterklassendefinition entfernen und den Filter mit einer FilterRegistrationBean registrieren :

@Bean public FilterRegistrationBean loggingFilter(){ FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(new RequestResponseLoggingFilter()); registrationBean.addUrlPatterns("/users/*"); return registrationBean; }

Jetzt gilt der Filter nur für Pfade, die dem Muster / users / * entsprechen .

Um URL-Muster für den Filter festzulegen , können Sie die Methoden addUrlPatterns () oder setUrlPatterns () verwenden.

3. Ein kurzes Beispiel

Erstellen wir nun einen einfachen Endpunkt und senden eine HTTP-Anfrage an diesen:

@RestController @RequestMapping("/users") public class UserController { @GetMapping() public List getAllUsers() { // ... } }

Die Anwendungsprotokolle beim Aufrufen dieser API sind:

23:54:38 INFO com.spring.demo.TransactionFilter - Starting Transaction for req :/users 23:54:38 INFO c.s.d.RequestResponseLoggingFilter - Logging Request GET : /users ... 23:54:38 INFO c.s.d.RequestResponseLoggingFilter - Logging Response :application/json;charset=UTF-8 23:54:38 INFO com.spring.demo.TransactionFilter - Committing Transaction for req :/users

Dies bestätigt, dass Filter in der gewünschten Reihenfolge aufgerufen werden.

4. Fazit

In diesem Artikel haben wir zusammengefasst, wie benutzerdefinierte Filter in einer Spring Boot-Webanwendung definiert werden.

Wie immer finden Sie Code-Schnipsel auf GitHub.