Wie definiere ich einen Spring Boot Filter?
1. Überblick
In diesem kurzen Tutorial erfahren Sie, wie Sie mithilfe von Spring Boot benutzerdefinierte Filter definieren und deren Aufrufreihenfolge festlegen.
Weitere Lektüre:
Finden Sie die registrierten Spring-Sicherheitsfilter
Erfahren Sie, wie Sie alle registrierten Spring Security-Filter in einer Anwendung finden.
Konfigurieren Sie eine Spring Boot-Webanwendung
Einige der nützlicheren Konfigurationen für eine Spring Boot-Anwendung.
2. Filter und Aufrufreihenfolge definieren
Beginnen wir mit der Erstellung von zwei Filtern:
-
TransactionFilter - um Transaktionen zu starten und festzuschreiben
-
RequestResponseLoggingFilter - um Anfragen und Antworten zu protokollieren
Um einen Filter zu erstellen, müssen wir einfach dieFilter-Schnittstelle implementieren:
@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@Componentdefinieren.
Und damit die Filter in der richtigen Reihenfolge ausgelöst werden, mussten wir die Annotation@Orderverwenden.
2.1. Filtern mit URL-Muster
Im obigen Beispiel sind unsere Filter standardmäßig für alle URLs in unserer Anwendung registriert. Es kann jedoch vorkommen, dass ein Filter nur auf bestimmte URL-Muster angewendet werden soll.
In diesem Fall müssen wir die Annotation@Component aus der Filterklassendefinition undregister the filter using a*FilterRegistrationBean*: entfernen
@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 von/users/*entsprechen.
Um URL-Muster für den Filter festzulegen, können Sie die MethodenaddUrlPatterns() odersetUrlPatterns()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 lauten:
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 die 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 können Codefragmenteover on GitHub gefunden werden.