Utilizando Servlet Filter com JavaServer Faces
Quando vamos desenvolver uma aplicação web, nos vem em mente vários recursos para monitorar uma aplicação, para que usuários não autenticados possam entrar.
Quando vamos desenvolver uma aplicação web, nos vem em mente vários recursos para monitorar uma aplicação, para que usuários não autenticados possam entrar. Neste artigo irei abordar uma forma bem simples de fazer isto, utilizando um Servlet Filter para filtrar nossa aplicação, onde irei demonstrar em um exemplo prático e simples de autenticação de usuários.
Os filtros são recursos da especificação Servlet 2.3, possibilitando que você intercepte uma solicitação antes dela atingir um recurso. Um filtro dá acesso aos objetos HttpServletRequest e HttpServletResponse antes de serem passados a um servlet.
Para um filtro interceptar uma solicitação a um servlet, você precisa declarar o filtro com um elemento <filter> na distribuição descritiva (web.xml) e mapear o filtro para servlet, usando o elemento <filter-mapping>. Você pode também usar um filtro que trabalhe em múltiplos servlets. Isso pode ser feito mapeando um filtro a um URL padrão, para que qualquer solicitação que combine com aquela URL padrão seja filtrada.
Ao escrever um Servlet Filter, basicamente você lida com três interfaces no pacote javax.servlet:
- Filter
- FilterConfig
- FilterChain
A interface Filter, está localizada no pacote javax.serlvet.Filter . É uma interface que você precisa implementar ao escrever um filtro. O ciclo de vida de um filtro é representado por três métodos da interface Filter, o init, doFilter e destroy. Veja a listagem 01.
public void init(FilterConfig filterConfig)
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
public void destroy()
Listagem 01
Um filtro inicia a sua vida quando o seu método init é chamado pelo contentor(por exemplo Apache Tomcat) de servlet. O contentor de servlet chama um método init do filtro apenas uma vez, quando ele termina de executar o filtro. O contentor de servlet passará no objeto FilterConfig, que representa a configuração do filtro. O método init pode ser comparado ao método init da interface Servlet.
O método doFilter é onde a filtragem é feita. O contentor de servlet chama o método doFilter sempre que um usuário solicita um recurso, tal como um servlet, ao qual o filtro está mapeado. Quando o doFilter é chamado, o contentor de servlet passa no objeto HttpServletRequest, no HttpServletResponse e num objeto FilterChain. Os objetos HttpServletRequest e HttpServletResponse são os mesmos objetos que serão passados a um servlet.
Um objeto FilterConfig representa a configuração para o filtro. Esse objeto permite que você obtenha o objeto ServletContext e passe valores de iniciação ao filtro através de seus parâmetros iniciais, que são definidos na distribuição descritiva, ao declarar o filtro. A listagem 02 mostra a interface FilterConfig:
public String getFilterName()
public String getInitParameter(String parameterName)
public java.util.Enumeration getInitParameterNames()
public ServletContext getServletContext()
Listagem 02
Um objeto Filter Chain é passado pelo contentor de servlet ao método doFilter, da classe do filtro. O filtros usam o objeto FilterChain para chamar o próximo filtro na cadeia ou, se o filtro for o último na cadeia, para chamar o próximo recurso(servlet). A interface FilterChain tem apenas um método doFIlter listado abaixo:
public void doFilter(HttpServletRequest request, HttpServletResponse
response)
Exemplo 01
Vamos desenvolver uma simples aplicação onde simularemos uma autenticação de usuários com nome e senha de usuário já definida na nossa classe.
Primeiro iremos criar nossa classe de autenticação chamada Login, com um método com o retorno do tipo String. Esse método irá processar as informações que o usuário fornecer e registrar na sessão o seu nome. Na listagem 03 está a nossa classe Login
public class Login {
private String nome; //get/set
private String senha; //get/set
public String checkLogin() throws Exception {
FacesContext fc = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
if( nome != null && nome.equals("faces") && senha != null && senha.equals("123") ){
session.setAttribute("NOME", getNome() );
return "success";
}else{
addMessage("INFORMAÇÕES INCORRETAS!!!");
return "failure";
}
}}
Listagem 03
Em nossa aplicação, se o usuário for autenticado com sucesso ele será redirecionado para a página welcome.jsp, caso contrário ficará na mesma página e será exibida uma mensagem informando que seus dados são inválidos. O intuito de registrar o nome do usuário na sessão é para quando o Filtro processar, ele irá verificar se o usuário tem essa sessão.
Próximo passo é escrevermos o nosso Servlet Filter que irá cuidar dos usuários não autenticado. A listagem 04 mostra o nosso filtro:
Após criarmos nosso filtro, devemos especificá-lo no web.xml:
<!-- FILTER -->
<filter>
<filter-name>FilterSecurity</filter-name>
<filter-class>servlet.FilterSecurity</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterSecurity</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
<!-- FILTER -->
Listagem 04
Em alguns casos você pode monitorar toda a sua aplicação, neste caso o seu elemento url-pattern ficaria assim: <url-pattern>/*</url-pattern>
Mas na nossa aplicação queremos apenas monitorar a pasta jsp onde fica as páginas do sistema.
Nossa aplicação está pronta, basta você testar tentando primeiramente acessar via url a pasta jsp desta forma:
http://localhost:8084/filterjsf/jsp/welcomeJSF.jsf
Como o usuário não tem nenhuma sessão registrada, ele será automaticamente redirecionado para a página de login. E após a autenticação ele irá acessar normalmente o sistema. Este exemplo está disponível para download em um projeto do NetBeans IDE 5.5, basta abri-lo na ferramenta e testá-lo.
Conclusão
Utilizar filtros é fundamental em uma aplicação web, porém não é a única forma para monitorar usuários. Há também segurança descritiva via web.xml e JAAS. Espero ter esclarecido sobre a utilização de filtros, qualquer dúvida é só escrever!!
Referências
Especificação de Servlet 2.3 http://java.sun.com/products/servlet/download.html
Wendell Miranda Sacramento
Wendell Miranda Sacramento (wendellmiranda@gmail.com) Trabalha desde 2003 com Java tendo como experiência desenvolvimento de sistemas web na plataforma Java EE. Atualmente trabalha no desenvolvimento de soluções para a segurança pública do estado do Amapá no Processamento de Dados do Amapá - PRODAP.
4 COMENTÁRIOS

download


