Professor, boa noite
Poderia me explicar de uma outra forma, o funcionamento do filter? Pq não foi necessário registrar ele no Spring? Como funciona esse lance de FilterBefore?
Desde já, muito obrigado
Professor, boa noite
Poderia me explicar de uma outra forma, o funcionamento do filter? Pq não foi necessário registrar ele no Spring? Como funciona esse lance de FilterBefore?
Desde já, muito obrigado
Oi Thiago,
Toda requisição que o Spring recebe é encaminhada a algum Controller
, que fará o tratamento dela.
Mas antes de chamar o Controller, o Spring tem várias classes que são chamadas antes, para fazer verificações de segurança, validações, tratamento de cabeçalhos, etc.
Um tipo dessas classes são os Filters
, que servem para interceptar a requisição e fazer algum tratamento a ela, inclusive podendo também interromper a requisição, evitando que ela chegue no Controller.
O Spring já possui alguns filters dele mesmo, que são carregados automaticamente pela aplicação.
Mas caso você precise, pode criar o seu próprio filter para fazer alguma lógica que você não quer colocar no controller ou camada de serviço da aplicação. Geralmente são lógicas que precisam ser chamadas em várias ou todas funcionalidades da aplicação, e para evitar a repetição dela, o filter ajuda no isolamento desse código.
Mas quando temos mais de um filter na aplicação, passamos a ter um problema, pois o Spring precisa saber qual filter deve chamar primeiro, pois a lógica dentro de um filter pode influenciar na lógica do outro filter.
Por exemplo, imagina que o Spring tenha um filter que recupera e guarda o usuário logado na aplicação.
Se criarmos um filter que precisa pegar o usuário logado, precisamos garantir que ele seja chamado somente após o filter do spring, pois senão nosso filter ia receber null ao tentar recuperar o usuário logado, pois o filter do spring que recupera o usuário logado ainda não teria sido chamado.
Existem várias maneiras de criar filters no java e no Spring, sendo que uma delas foi a mostrada no curso, a qual cria uma classe implementando a interface OncePerRequestFilter
.
Mas ao criar um filter teremos o problema da ordem de execução, pois o Spring já possui um filter carregado automaticamente pela aplicação, que é o UsernamePasswordAuthenticationFilter
.
Por isso foi necessário configurar se o nosso filter deveria ser carregado antes ou depois desse filter do Spring. E no caso ele foi configurado para ser carregado antes.
Não cheguei a testar, mas acho que o nosso filter poderia ser carregado após o UsernamePasswordAuthenticationFilter
sem problemas.
Conseguiu entender melhor?
Se quiser mais um material gratuito para aprender sobre filters, recomendo ler o capítulo sobre o assunto, na apostila do curso Java Web da Caelum: https://www.caelum.com.br/apostila-java-web/recursos-importantes-filtros/
Bons estudos!