Filtros em Servlets e JSP são classes Java e seu propósito de existência é o seguinte:
Interceptar ao solicitar acesso a um recurso de back-end
Gerencie as respostas retornadas do servidor para o cliente
Vários tipos de filtros comuns estão listados abaixo:
Filtro de autenticação
Filtro de compactação de dados
filtro de criptografia
Filtros que acionam eventos de acesso a recursos
Filtro de conversão de imagem
Filtros de login e autenticação
Filtro de cadeia tipo MIME
Filtro de token
Filtros XSL/T para transformar conteúdo XML
O filtro será inserido no arquivo web.xml e mapeado para o nome do servlet, arquivo JSP ou padrão de URL. O arquivo de descrição de implementação web.xml pode ser localizado no diretório <diretório de instalação do Tomcat>conf.
Quando o contêiner JSP inicia um aplicativo da web, ele cria uma instância de cada filtro. Esses filtros devem ser declarados no arquivo descritor de implementação web.xml e executados na ordem em que são declarados.
Um filtro é uma classe Java que implementa a interface javax.servlet.Filter. A interface javax.servlet.Filter define três métodos:
número de série | Método e Descrição |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) O contêiner chamará este método sempre que uma solicitação/resposta passar pela cadeia de filtros, pois o cliente solicita recursos no final da cadeia. |
2 | public void init(FilterConfig filterConfig) O contêiner chama esse método para indicar que um filtro é colocado no serviço |
3 | public void destroy() Este método é chamado pelo contêiner para indicar que um filtro está sendo removido do serviço |
Este exemplo imprimirá o endereço IP e a data e hora de cada acesso ao arquivo JSP. Claro, este é apenas um exemplo simples para lhe dar uma ideia do uso simples de filtros, mas você pode usar esses conceitos para construir programas mais complexos por conta própria.
//Introduzir o pacote Java import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.* //Implementar a classe Filter public class LogFilter implements Filter { public void; init( FilterConfig config) throws ServletException{ // Obtém parâmetros de inicialização String testParam = config.getInitParameter("test-param"); //Imprime parâmetros de inicialização System.out.println("Test Param: " + testParam); public void doFilter(Solicitação ServletRequest, resposta ServletResponse, cadeia FilterChain) lança java.io.IOException, ServletException { // Obtém o endereço IP do cliente String ipAddress = request.getRemoteAddr(); // Saída do endereço IP e hora atual System.out.println("IP "+ ipAddress + ", Time " + new Date().toString()); // Passa a cadeia de filtro de solicitação chain.doFilter(request,response); public void destroy(){ /* Após a instância do filtro ser destruída no servidor Chamado antes da remoção. */ }}
Compile o arquivo LogFilter.java e, em seguida, coloque o arquivo de classe compilado no diretório <diretório de instalação do Tomcat>/webapps/ROOT/WEB-INF/classes.
Os filtros são definidos e mapeados para uma URL ou nome de arquivo JSP, da mesma forma que os servlets são definidos e mapeados. No arquivo de descrição de implantação web.xml, use a tag <filter> para mapeamento de filtro:
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value >Parâmetro de inicialização</param-value> </init-param></filter><filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
O filtro acima será aplicado a todos os servlets e programas JSP porque especificamos "/*" na configuração. Também é possível especificar um servlet ou caminho JSP se desejar aplicar o filtro apenas a alguns servlets ou programas JSP.
Agora acesse o servlet ou página JSP normalmente e você encontrará um registro desse acesso no log do servidor. Você também pode usar o criador de logs Log4J para registrar em outros arquivos.
Seu aplicativo web pode definir muitos filtros diferentes. Agora que você tem dois filtros definidos, AuthenFilter e LogFilter, as outras etapas são as mesmas de antes, exceto que você cria um mapeamento diferente, como este:
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value >Parâmetro de inicialização</param-value> </init-param></filter> <filter> <filter-name>AuthenFilter</filter-name> <filter-class>AuthenFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Parâmetro de inicialização</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping> <filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
A ordem de mapeamento dos elementos <filter> em web.xml determina a ordem na qual o contêiner aplica esses filtros. Para reverter a ordem de aplicação, basta inverter a ordem em que os elementos <filter> são definidos em web.xml.
Por exemplo, o exemplo acima aplicaria primeiro o LogFilter e depois o AuthenFilter, mas o exemplo a seguir inverteria a ordem de aplicação:
<filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping> <filter-mapping> <filter-name>LogFilter</filter -name> <url-pattern>/*</url-pattern></filter-mapping>