Servlets - escrevendo filtros
Filtros de servlet são classes Java que podem ser usadas na programação de servlet para os seguintes propósitos -
Para interceptar solicitações de um cliente antes que eles acessem um recurso no back end.
Para manipular as respostas do servidor antes de serem enviadas de volta ao cliente.
Existem vários tipos de filtros sugeridos pelas especificações -
- Filtros de autenticação.
- Filtros de compressão de dados.
- Filtros de criptografia.
- Filtros que acionam eventos de acesso a recursos.
- Filtros de conversão de imagem.
- Filtros de registro e auditoria.
- Filtros de cadeia do tipo MIME.
- Filtros de tokenização.
- Filtros XSL / T que transformam conteúdo XML.
Os filtros são implantados no arquivo descritor de implantação web.xml e, em seguida, mapeie para nomes de servlet ou padrões de URL no descritor de implantação de seu aplicativo.
Quando o contêiner da web inicia seu aplicativo da web, ele cria uma instância de cada filtro que você declarou no descritor de implantação. Os filtros são executados na ordem em que são declarados no descritor de implantação.
Métodos de filtro de servlet
Um filtro é simplesmente uma classe Java que implementa a interface javax.servlet.Filter. A interface javax.servlet.Filter define três métodos -
Sr. Não. | Método e Descrição |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) Este método é chamado pelo contêiner sempre que um par de solicitação / resposta é passado pela cadeia devido a uma solicitação do cliente por um recurso no final da cadeia. |
2 | public void init(FilterConfig filterConfig) Este método é chamado pelo contêiner da web para indicar a um filtro que ele está sendo colocado em serviço. |
3 | public void destroy() Este método é chamado pelo contêiner da web para indicar a um filtro que ele está sendo retirado de serviço. |
Filtro de servlet - exemplo
A seguir está o Exemplo de Filtro de Servlet que imprimiria o endereço IP do cliente e a data e hora atual. Este exemplo daria a você uma compreensão básica do Filtro de Servlet, mas você pode escrever aplicativos de filtro mais sofisticados usando o mesmo conceito -
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Implements Filter class
public class LogFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
// Get init parameter
String testParam = config.getInitParameter("test-param");
//Print the init parameter
System.out.println("Test Param: " + testParam);
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws java.io.IOException, ServletException {
// Get the IP address of client machine.
String ipAddress = request.getRemoteAddr();
// Log the IP address and current timestamp.
System.out.println("IP "+ ipAddress + ", Time " + new Date().toString());
// Pass request back down the filter chain
chain.doFilter(request,response);
}
public void destroy( ) {
/* Called before the Filter instance is removed from service by the web container*/
}
}
Compilar LogFilter.java da maneira usual e coloque seu arquivo de classe em <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes
Mapeamento de filtro de servlet em Web.xml
Os filtros são definidos e, em seguida, mapeados para um URL ou Servlet, da mesma forma que o Servlet é definido e, em seguida, mapeado para um padrão de URL. Crie a seguinte entrada para a tag de filtro no arquivo descritor de implantaçãoweb.xml
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>LogFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
O filtro acima se aplicaria a todos os servlets porque especificamos /*em nossa configuração. Você pode especificar um caminho de servlet específico se quiser aplicar o filtro apenas em alguns servlets.
Agora tente chamar qualquer servlet da maneira usual e você verá o log gerado no log do seu servidor web. Você pode usar o logger Log4J para registrar o log acima em um arquivo separado.
Usando vários filtros
Seu aplicativo da web pode definir vários filtros diferentes com uma finalidade específica. Considere, você define dois filtros AuthenFilter e LogFilter . O resto do processo permaneceria conforme explicado acima, exceto que você precisa criar um mapeamento diferente, conforme mencionado abaixo -
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>LogFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</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>Initialization Paramter</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>
Ordem de aplicação de filtros
A ordem dos elementos de mapeamento de filtro em web.xml determina a ordem em que o contêiner da web aplica o filtro ao servlet. Para reverter a ordem do filtro, você só precisa reverter os elementos de mapeamento de filtro no arquivo web.xml.
Por exemplo, o exemplo acima aplicaria LogFilter primeiro e, em seguida, aplicaria AuthenFilter a qualquer servlet, mas o exemplo a seguir inverteria a ordem -
<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>