Gostaria de saber se existe alguma anotação para uma Filter
classe (para aplicativos da Web) no Spring Boot? Talvez @Filter
?
Quero adicionar um filtro personalizado ao meu projeto.
O Guia de Referência do Spring Boot mencionado sobre
FilterRegistrationBean
, mas não sei como usá-lo.
java
configuration
spring-boot
servlet-filters
janetsmith
fonte
fonte
Respostas:
Se você deseja configurar um filtro de terceiros, pode usar
FilterRegistrationBean
. Por exemplo, o equivalente a web.xmlEsses serão os dois beans no seu
@Configuration
arquivoO acima foi testado com boot de mola 1.2.3
fonte
someFilter()
diretamente.Aqui está um exemplo de um método de inclusão de um filtro personalizado em um aplicativo Spring Boot MVC. Certifique-se de incluir o pacote em uma verificação de componente:
fonte
MetricsFilter
, mas esse bean será ofuscado pelo bean do atuador Spring com o mesmo nome. Aprendi isso da maneira mais difícil ...Não há uma anotação especial para indicar um filtro de servlet. Você acabou de declarar um
@Bean
do tipoFilter
(ouFilterRegistrationBean
). Um exemplo (adicionando um cabeçalho personalizado a todas as respostas) está no próprio EndpointWebMvcAutoConfiguration do Boot ;Se você declarar apenas um
Filter
, será aplicado a todos os pedidos. Se você também adicionar um,FilterRegistrationBean
poderá especificar adicionalmente servlets e padrões de URL a serem aplicados.Nota:
A partir do Spring Boot 1.4,
FilterRegistrationBean
não é preterido e simplesmente move os pacotes deorg.springframework.boot.context.embedded.FilterRegistrationBean
paraorg.springframework.boot.web.servlet.FilterRegistrationBean
fonte
Filter
no seu caminho de classe. Normalmente, eu apenas usaria ospring-boot-starter-web
para obter todas as dependências relevantes (por exemplo, aqui ).Existem três maneiras de adicionar seu filtro,
@Component
@Bean
comFilter
tipo no Spring@Configuration
@Bean
comFilterRegistrationBean
tipo no Spring@Configuration
O número 1 ou o número 2 funcionará se você desejar que o filtro se aplique a todos os pedidos sem personalização; use o número 3 caso contrário. Você não precisa especificar a varredura de componentes para que o número 1 funcione, desde que você coloque sua classe de filtro no mesmo ou subpacote de sua
SpringApplication
classe. Para o número 3, o uso juntamente com o número 2 é necessário apenas quando você deseja que o Spring gerencie sua classe de filtro, como dependências automáticas. Funciona muito bem para eu colocar meu novo filtro, que não precisa de nenhuma dependência / injeção automática.Embora a combinação de # 2 e # 3 funcione bem, fiquei surpreso por não ter dois filtros aplicados duas vezes. Meu palpite é que o Spring combina os dois beans como um quando chama o mesmo método para criar os dois. Caso você queira usar o nº 3 sozinho com a autenticação automática, você pode
AutowireCapableBeanFactory
. A seguir está um exemplo,fonte
Filter
durante o usoFilterRegistrationBean
ATUALIZAÇÃO: 16-12-2017:
Existem 2 maneiras simples de fazer isso no Spring Boot 1.5.8.RELEASE, sem necessidade de XML.
Primeira maneira: se você não possui um padrão de URL específico, pode usar o @Component assim: (Código e detalhes completos estão aqui https://www.surasint.com/spring-boot-filter/ )
Segunda maneira: se você deseja usar padrões de URL, pode usar o @WebFilter assim: (Código e detalhes completos estão aqui https://www.surasint.com/spring-boot-filter-urlpattern/ )
Mas você também precisa adicionar a anotação @ServletComponentScan na sua classe @SpringBootApplication:
Observe que @Component é a anotação do Spring, mas @WebFilter não. O @WebFilter é uma anotação do Servlet 3.
Nos dois sentidos, você só precisa da dependência básica do Spring Boot no pom.xml (não é necessário jasper incorporado explícito do tomcat)
AVISO: A primeira maneira, se o Controlador no Spring Boot retornar para um arquivo JSP, a solicitação passará o filtro duas vezes.
Enquanto, na segunda maneira, a solicitação passará no filtro apenas uma vez.
Prefiro a segunda maneira, porque é mais semelhante ao comportamento padrão na especificação de Servlet ( https://docs.oracle.com/cd/E19879-01/819-3669/6n5sg7b0b/index.html )
Você pode ver mais registros de teste aqui https://www.surasint.com/spring-boot-webfilter-instead-of-component/
fonte
Filter
interface sendo chamada várias vezes durante o lançamento do applicationContext. Existe alguma maneira de executá-lo apenas uma vez?Aqui está um exemplo da minha classe de filtro personalizada:
E eu o adicionei à configuração de inicialização do Spring adicionando-a à classe Configuration da seguinte maneira:
fonte
Nos documentos do Spring,
Contêineres de servlet incorporados - Adicione um servlet, filtro ou ouvinte a um aplicativo
Por exemplo:
Adicione essa
@Bean
configuração à sua@Configuration
classe e o filtro será registrado na inicialização.Além disso, você pode adicionar Servlets, Filtros e Ouvintes usando a verificação de caminho de classe,
fonte
Se você usa o Spring Boot + Spring Security, pode fazer isso na configuração de segurança.
No exemplo abaixo, estou adicionando um filtro personalizado antes do UsernamePasswordAuthenticationFilter (veja todos os filtros padrão do Spring Security e sua ordem ).
E a classe de filtro
fonte
Usando a anotação @WebFilter, isso pode ser feito da seguinte maneira:
fonte
Temos aproximadamente quatro opções diferentes para registrar um filtro usando o Spring .
Primeiramente, podemos criar um bean Spring implementando o Filter ou estendendo o HttpFilter :
Em segundo lugar, podemos criar um bean Spring estendendo o GenericFilterBean :
Como alternativa, podemos usar a classe FilterRegistrationBean :
E por último, podemos usar o @WebFilter anotação com @ServletComponentScan :
fonte
É mais um conselho do que resposta, mas se você estiver usando um Spring MVC em seu aplicativo da web, a boa idéia é usar o Spring HandlerInterceptor em vez do Filter
Ele pode fazer o mesmo trabalho, mas também - Pode trabalhar com ModelAndView - Seus métodos podem ser chamados antes e depois do processamento da solicitação ou após a conclusão da solicitação.
- Pode ser facilmente testado
1 Implemente a interface HandlerInterceptor e adicione uma anotação @Component à sua classe
2 Configure seu Interceptor
fonte
Esse filtro também ajudará você a permitir o acesso entre origens
fonte
Você pode usar @WebFilter javax.servlet.annotation.WebFilter em uma classe que implementa javax.servlet.Filter
Em seguida, use @ServletComponentScan para registrar
fonte
Vi muitas respostas aqui, mas não tentei nenhuma delas. Acabei de criar o filtro como no código a seguir.
E deixou o restante do aplicativo Spring Boot como estava.
fonte
Você precisa de duas coisas principais: - Adicionar
@ServletComponentScan
à sua classe principal - você pode adicionar um pacote chamado filter dentro dele, para criar umaFilter
classe com o seguinte:fonte
você também pode criar um filtro usando o @WebFilter e implementa o Filter, ele fará.
fonte
Filtros como o nome sugere usado para executar a filtragem na solicitação para um recurso ou na resposta de um recurso, ou em ambos. O Spring Boot fornece poucas opções para registrar filtros personalizados no aplicativo Spring Boot. Vejamos as diferentes opções.
1. Definir filtro de inicialização da primavera e ordem de chamada
Implemente a interface Filter para criar um novo filtro no Spring Boot.
Vamos examinar rapidamente alguns pontos importantes no código acima
Para disparar filtros na ordem certa, precisamos usar a anotação @Order .
No código acima, CustomFirstFilter será executado antes do CustomSecondFilter.
2. Padrão de URL
Se o mapeamento baseado em convenções não for flexível o suficiente, podemos usar FilterRegistrationBean para o controle completo do aplicativo. Aqui, não use a anotação @Component para a classe filter, mas registre o filtro usando um FilterRegistrationBean .
Registre o filtro personalizado usando FilterRegistrationBean .
fonte
Você precisa implementar o Filter e precisa ser anotado com @WebFilter (urlPatterns = "/ *")
E na classe Aplicativo ou Configuração, você precisa adicionar @ServletComponentScan. Dessa forma, seu filtro será registrado.
fonte
@WebFilter
ocorre apenas desde o Servlet 3.0. Portanto, ele pode não funcionar corretamente para 2.5Etapa 1: Crie um componente de filtro implementando a interface Filter.
Etapa 2: defina esse filtro para os padrões de URI usando FilterRegistrationBean.
Você pode consultar este link para obter a aplicação completa.
fonte
Primeiro, adicione
@ServletComponentScan
à sua classe SpringBootApplication.Segundo, crie um arquivo de filtro estendendo a classe Filter ou de filtro de terceiros e adicione
@WebFilter
a este arquivo assim:fonte
Eu vi a resposta de @Vasily Komarov. Abordagem semelhante, mas usando a classe abstrata HandlerInterceptorAdapter em vez de usar HandlerInterceptor .
Aqui está um exemplo...
fonte
Como todos sabem, o Spring Boot é uma maneira maravilhosa de desenvolver um WebApp ou StandaloneApp com configuração mínima e instalação opinativa.
Foi assim que consegui um desenvolvimento de filtro da Web no aplicativo Spring Boot
Versão Spring Boot: 2.0.4.RELEASE
Versão Java: 8.0
Especificação de Servlet: Servlet 3.0 (obrigatório e importante)
Declarei meu filtro da Web da seguinte maneira, aderindo às especificações de servlet 3.0
Essa é a maneira programática de definir um filtro como um substituto das definições baseadas no web.xml.
A anotação "@Webfilter" será processada pelo contêiner durante a implantação, a classe Filter na qual ela será encontrada será criada conforme a configuração e aplicada aos padrões de URL, javax.servlet.Servlets e javax.servlet.DispatcherTypes.
Para implantar o aplicativo Spring Boot como "WAR tradicional", a classe do aplicativo deve estender o SpringBootServletInitializer.
NOTA :: SpringBootServletInitializer é uma "Implementação Programática" do web.xml com referência às especificações do Servlet 3.0+, que requer uma implementação do WebApplicationInitializer.
Portanto, SpringBootApplication não requer "web.xml", pois sua classe Application (após estender o SpringBootServletInitializer) procura
- @WebFilter,
- @WebListener e
- @WebServlet.
Esta anotação permite a varredura de pacotes base para os componentes da web anotados com @WebFilter, @WebListener e @WebServlet.
Como os contêineres incorporados não suportam as anotações @WebServlet, @WebFilter e @WebListener, o Spring Boot, contando bastante com os contêineres incorporados, apresentou esta nova anotação @ServletComponentScan para suportar alguns jars dependentes que usam essas três anotações.
A digitalização é realizada apenas ao usar um contêiner Servlet incorporado.
Aqui: eu defini uma classe personalizada: "ServletInitializer" que estende a classe: SpringBootServletInitializer.
Conforme explicado anteriormente, o SpringBootServletInitializer é responsável pela verificação das anotações: -
- @WebFilter,
- @WebListener e
- @WebServlet.
E, portanto, a classe de aplicativo Spring Boot deve
fonte
Os filtros são usados principalmente nos arquivos do criador de logs, varia de acordo com o criador de logs que você está usando no projeto Lemme Explicate para log4j2:
Os filtros são usados para restringir os dados e eu usei o filtro de limite ainda mais para restringir os níveis de dados no fluxo. Mencionei os níveis que podem ser restringidos por lá. Para sua referência adicional, consulte a ordem dos níveis de log4j2 - Log4J: ALL> TRACE> DEBUG> INFO> WARN> ERRO> FATAL> OFF
fonte
FilterRegistrationBean
como mencionado na perguntajavax.servlet.Filter
, esta resposta fala sobre #org.apache.logging.log4j.core.Filter