Os filtros são interceptadores de requisições e serão chamados antes do fluxo padrão da aplicação e estes poderão ou não dar prosseguimento a este fluxo. Caso haja a necessidade da utilização de mais de um filtro, uma cadeia de filtro pode ser utilizada, sendo que cada filtro executa e pode chamar o próximo para que seja executado.
Para criar um filtro, deve-se declarar uma classe que implementa Filter
(javax.servlet
), com os métodos init
, destroy
e doFilter
. Este último recebe uma cadeia de filtros FilterChain
(javax.servlet
) e é através desta que um filtro chama o próximo para executar, dando prosseguimento à seqüência de execução.
public class MyFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
O método doFilter
do FilterChain
dá prosseguimento à cadeia, chamando o próximo filtro ou a aplicação.
Para o filtro executar, devemos mapear quais urls ele irá interceptar. Fazemos isso como nas Servlets
, declarando e mapeando os filtros no web.xml
ou usando anotações.
web.xml
:
Primeiramente, define-se o filtro com o seu nome e sua classe, usando a tag <filter>
. Depois, mapeia-se o padrão da url utilizando o nome definido anteriormente.
<filter>
<filter-name>meuFiltro</filter-name>
<filter-class>my.project.package.filtro.MeuFiltro</filter-class>
</filter>
<filter-mapping>
<filter-name>meuFiltro</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
@WebFilter
(javax.servlet.annotation
) para informar que a classe é uma servlet.
O padrão da url é definido utilizando-se o parâmetro urlPatterns
.
@WebFilter(urlPatterns = "/url")
public class ServletClass extends HttpServlet {
Para o filtro ser executado em qualquer requisição o mapeamento deve ser feito usando a url “/*”