DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

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.
O que você achou deste post?

    4 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Marcelo
parabens pelo artigo, mas estou muito confuso com algumas defiunições: O que é "Contentor de Servlet" e como eu faço uma "Distribuição Descritiva"?
[há +1 ano] - Responder

 

Wendell Miranda
distribuição descritiva (web.xml) Contentor ou Container Web (Ex: Apache Tomcat) Abraço!
[há +1 ano] - Responder
 

Filipe Aguilar Santana
Olá! Muito bom o post! Tenho uma dúvida. Por um acaso esta faltando a implementação da classe servlet.FilterSecurity? Obrigado.
[há +1 ano] - Responder

 

Dyego Souza Do Carmo
Existe uma implementacao basica de filtro de seguranca , chegou a colocar esta api ?
[há +1 ano] - Responder
 
Cursos relacionados
Publicidade
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03