Come definire un filtro Spring Boot?

1. Panoramica

In questo breve tutorial, esploreremo come definire filtri personalizzati e specificare il loro ordine di chiamata con l'aiuto di Spring Boot.

2. Definizione di filtri e ordine di invocazione

Cominciamo creando due filtri:

  1. TransactionFilter : per avviare e eseguire il commit delle transazioni
  2. RequestResponseLoggingFilter : per registrare richieste e risposte

Per creare un filtro, dobbiamo semplicemente implementare l' interfaccia del filtro :

@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 } 

Affinché Spring potesse riconoscere un filtro, era necessario definirlo come un bean con l' annotazione @Component .

E, per fare in modo che i filtri si attivino nel giusto ordine, dovevamo usare l' annotazione @Order .

2.1. Filtra con pattern URL

Nell'esempio sopra, i nostri filtri sono registrati per impostazione predefinita per tutti gli URL nella nostra applicazione. Tuttavia, a volte potremmo voler applicare un filtro solo a determinati pattern URL.

In questo caso, dobbiamo rimuovere l' annotazione @Component dalla definizione della classe del filtro e registrare il filtro utilizzando FilterRegistrationBean :

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

Ora il filtro si applicherà solo ai percorsi che corrispondono al pattern / users / * .

Per impostare i pattern URL per il filtro, possiamo utilizzare i metodi addUrlPatterns () o setUrlPatterns () .

3. Un rapido esempio

Creiamo ora un semplice endpoint e inviamo una richiesta HTTP:

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

I registri dell'applicazione quando si colpisce questa API sono:

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

Ciò conferma che i filtri vengono richiamati nell'ordine desiderato.

4. Conclusione

In questo articolo, abbiamo riassunto come definire filtri personalizzati in una webapp Spring Boot.

Come sempre, gli snippet di codice possono essere trovati su GitHub.