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.
Configurar um aplicativo Web de inicialização Spring
Algumas das configurações mais úteis para um aplicativo Spring Boot.
2. Definindo filtros e a ordem de invocação
Vamos começar criando dois filtros:
-
TransactionFilter - para iniciar e confirmar transações
-
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.