Wie definiere ich einen Spring Boot-Filter?

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.

Read more

Konfigurieren Sie eine Spring Boot-Webanwendung

Einige der nützlicheren Konfigurationen für eine Spring Boot-Anwendung.

Read more

2. Filter und Aufrufreihenfolge definieren

Beginnen wir mit der Erstellung von zwei Filtern:

  1. TransactionFilter - um Transaktionen zu starten und festzuschreiben

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