quinta-feira, 23 de abril de 2009

Servlet Filter

Servlet Filters é um recurso do Java EE para interceptar uma requisição web antes do recurso final ser atingido, este recurso pode ser um servlet, um arquivo, entre outros.

Filtros são muito úteis quando precisamos configurar o ambiente para o recurso a ser atingido, como por exemplo, abrir e fechar a sessão do hibernate (openSessionInView), verificar se o usuário está logado ou se tem permissão de fazer a requisição, permitindo ou não acessar o recurso.

Para usar Servlet Filter é necessário:

1. Criar uma classe que será utilizada como filtro pela sua aplicação. Esta classe precisa implementar a interface javax.servlet.Filter. Ex.: public class MyFilter implements Filter

2. Declarar sua classe filtro no web.xml da sua aplicação. Ex.:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>mypackage.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/restrito/*</url-pattern>
</filter-mapping>
3. Implementar os métodos init, destroy e doFilter da interface Filter.

É no método doFilter onde tudo acontece. Ex.:
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// Executado antes de ir para o servlet
JPAUtil.createEntityManager();
chain.doFilter(request, response);
// Executado após o servlet ser executado
JPAUtil.closeEntityManager();
}
Este método é executado toda vez que é realizada uma requisição a um recurso que se encaixa na
tag url-pattern configurada no web.xml.
Dependendo das validações realizadas você pode impedir que o recurso seja atingido, para isso é só não executar
chain.doFilter(request, response);
FilterChain chama o próximo recurso da sequência. Você pode ter mais de um filtro para o mesmo url-pattern ou um recurso chamando outro.

No web.xml você também pode espeficicar em quais situações o filtro deve ser aplicado, usando a tag <dispatcher>. Ex.:
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
  • REQUEST: Quando o arquivo é acessado diretamente pelo navegador.
  • FORWARD: Quando o arquivo é acessado através de um forward de um servlet.
  • INCLUDE: Quando o arquivo é acessado através de um include do jsp (jsp:include).
  • ERROR: Quando o arquivo é um página de erro. Ex: <%@ page isErrorPage="true" %>

3 comentários: