Como definir um filtro de inicialização do Spring?

Como definir um filtro de inicialização do Spring?

 1. Visão geral

Neste tutorial rápido, vamos explorar como definir filtros personalizados e especificar sua ordem de invocação com a ajuda do Spring Boot.

Leitura adicional:

Encontre os filtros de segurança de primavera registrados

Aprenda a encontrar todos os filtros registrados do Spring Security em um aplicativo.

Read more

Configurar um aplicativo Web de inicialização Spring

Algumas das configurações mais úteis para um aplicativo Spring Boot.

Read more

2. Definindo filtros e a ordem de invocação

Vamos começar criando dois filtros:

  1. TransactionFilter - para iniciar e confirmar transações

  2. RequestResponseLoggingFilter - para registrar solicitações e respostas

Para criar um filtro, precisamos simplesmente implementar a interfaceFilter:

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

Para que o Spring seja capaz de reconhecer um filtro, precisamos defini-lo como um bean com a anotação@Component.

E, para que os filtros disparem na ordem certa, precisamos usar a anotação@Order.

2.1. Filtro com padrão de URL

No exemplo acima, nossos filtros são registrados por padrão para todos os URLs em nosso aplicativo. No entanto, às vezes podemos querer que um filtro se aplique apenas a determinados padrões de URL.

Neste caso, temos que remover a anotação@Component da definição da classe de filtro eregister the filter using a*FilterRegistrationBean*:

@Bean
public FilterRegistrationBean loggingFilter(){
    FilterRegistrationBean registrationBean
      = new FilterRegistrationBean<>();

    registrationBean.setFilter(new RequestResponseLoggingFilter());
    registrationBean.addUrlPatterns("/users/*");

    return registrationBean;
}

Agora o filtro só se aplicará a caminhos que correspondem ao padrão/users/*.

Para definir padrões de URL para o filtro, podemos usar os métodosaddUrlPatterns() ousetUrlPatterns().

3. Um Exemplo Rápido

Vamos agora criar um endpoint simples e enviar uma solicitação HTTP para ele:

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping()
    public List getAllUsers() {
        // ...
    }
}

Os logs do aplicativo ao acessar esta API são:

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

Isso confirma que os filtros são chamados na ordem desejada.

4. Conclusão

Neste artigo, resumimos como definir filtros personalizados em um webapp Spring Boot.

Como sempre, trechos de código podem ser encontradosover on GitHub.