Hoe definieer ik een Spring Boot-filter?

1. Overzicht

In deze korte zelfstudie onderzoeken we hoe u aangepaste filters kunt definiëren en hun aanroepvolgorde kunt specificeren met behulp van Spring Boot.

2. Filters en de aanroepopdracht definiëren

Laten we beginnen met het maken van twee filters:

  1. TransactionFilter - om transacties te starten en vast te leggen
  2. RequestResponseLoggingFilter - om verzoeken en reacties te loggen

Om een ​​filter te maken, moeten we eenvoudig het Filter koppel:

@Component @Order (1) openbare klasse TransactionFilter implementeert Filter {@Override public void doFilter ServletRequest-verzoek, ServletResponse-antwoord, FilterChain-keten) gooit IOException, ServletException {HttpServletRequest req = (HttpServletRequest) -verzoek; LOG.info ("Een transactie starten voor req: {}", req.getRequestURI ()); chain.doFilter (verzoek, antwoord); LOG.info ("Een transactie uitvoeren voor req: {}", req.getRequestURI ()); } // andere methodes } 
@Component @Order (2) public class RequestResponseLoggingFilter implementeert Filter {@Override public void doFilter (ServletRequest-verzoek, ServletResponse-antwoord, FilterChain-keten) gooit IOException, ServletException {HttpServletRequest req = (HttpServletRequest) -verzoek; HttpServletResponse res = (HttpServletResponse) antwoord; LOG.info ("Logboekverzoek {}: {}", req.getMethod (), req.getRequestURI ()); chain.doFilter (verzoek, antwoord); LOG.info ("Logging reactie: {}", res.getContentType ()); } // andere methodes } 

Om Spring in staat te stellen een filter te herkennen, moesten we het definiëren als een boon met de @Component annotatie.

En om de filters in de juiste volgorde te laten vuren, moesten we de @Bestellen annotatie.

2.1. Filter met URL-patroon

In het bovenstaande voorbeeld zijn onze filters standaard geregistreerd voor alle URL's in onze applicatie. Soms willen we echter dat een filter alleen van toepassing is op bepaalde URL-patronen.

In dit geval moeten we de @Component annotatie van de filterklassedefinitie en registreer het filter met een FilterRegistrationBean:

@Bean openbaar FilterRegistrationBean loggingFilter () {FilterRegistrationBean registrationBean = nieuw FilterRegistrationBean (); registrationBean.setFilter (nieuw RequestResponseLoggingFilter ()); registrationBean.addUrlPatterns ("/ gebruikers / *"); retourregistratieBean; }

Nu is het filter alleen van toepassing op paden die overeenkomen met de / gebruikers / * patroon.

Om URL-patronen voor het filter in te stellen, kunnen we de addUrlPatterns () of setUrlPatterns () methoden.

3. Een snel voorbeeld

Laten we nu een eenvoudig eindpunt maken en er een HTTP-verzoek naartoe sturen:

@RestController @RequestMapping ("/ users") openbare klasse UserController {@GetMapping () openbare lijst getAllUsers () {// ...}}

De applicatie-logs bij het raken van deze API zijn:

23:54:38 INFO com.spring.demo.TransactionFilter - Transactie starten voor req: / gebruikers 23:54:38 INFO csdRequestResponseLoggingFilter - Logboekverzoek GET: / gebruikers ... 23:54:38 INFO csdRequestResponseLoggingFilter - Logboekantwoord : application / json; charset = UTF-8 23:54:38 INFO com.spring.demo.TransactionFilter - Transactie vastleggen voor req: / gebruikers

Dit bevestigt dat filters in de gewenste volgorde worden aangeroepen.

4. Conclusie

In dit artikel hebben we samengevat hoe u aangepaste filters kunt definiëren in een Spring Boot-webapp.

Zoals altijd zijn codefragmenten te vinden op GitHub.