Desenvolvimento - Java

NetBeans IDE: Visual Web Pack - parte 5 - Criando um Servlet Filter, configurando, rodando e criando a saída da área administrativa

Nesta quinta e última etapa, vamos criar um Filtro com a API Servlet, que gerenciará o usuário verificando se está ou não logado, além de rodarmos a aplicação e por último adicionar a “ação” de “logout” na página.

por Edson Gonçalves



Olá pessoal,

Nesta quinta e última etapa, vamos criar um Filtro com a API Servlet, que gerenciará o usuário verificando se está ou não logado, além de rodarmos a aplicação e por último adicionar a “ação” de “logout” na página.

Criando o Filtro

Na etapa anterior, vimos que já podemos entrar na área administrativa, uma vez que o botão Logar agora possui o código necessário para verificar o usuário e a senha. Mas infelizmente, também estamos sabendo que não há segurança alguma nas áreas administrativas, o que acarretará em uma possível invasão.

Para evitar isso, devemos criar uma sessão gerenciada. A especificação da API Servlet possui uma forma de gerenciar esta situação através da API Servlet Filter. É a melhor maneira de redirecionar um usuário quando a sessão está expirada. Claro que isso também evita a entrada direta pelo endereço no navegador.

No código utilizado pelo botão Logar, na etapa anterior, nos criamos uma sessão chamada de “logado”, que possui o login do usuário como valor.

//cria uma sessão contendo o nome de usuario chamada logado

session.setAttribute("logado", usuario.getText() );

É através deste atributo de sessão que vamos nos basear para verificar se há ou não um usuário logado no sistema administrativo.

Para criar um filtro, cliquem com o botão direito do mouse sobre o projeto. Selecionem no menu de contexto o item Novo e cliquem em Arquivo/Pasta.

Na caixa de diálogo Novo Arquivo, selecione em Categorias o item Visual Web e Filtro em Tipos de Arquivo. Cliquem no botão Próximo.

Figura 1

Na segunda etapa da criação do Filtro, digite FiltroAdministrativo no campo Nome da Classe. Selecione no campo Pacote o pacote meupacote.admin. Clique no botão Próximo.

Figura 2

Na terceira etapa do assistente, selecione em Nome do Filtro, o item FiltroAdministrativo e clique no botão Editar.

Figura 3

Na caixa de diálogo Mapeamento do Filtro, em URL, adicione /faces/admin/*. Perceba que estamos adicionando um filtro de segurança em um diretório chamado admin com tudo que há dentro. Confirme no botão OK. E em seguida, confirme na caixa de diálogo Novo Arquivo no botão Finalizar.

Figura 4

O NetBeans criará uma classe, mapeada inclusive por seu deployment descriptor (web.xml), chamada de FiltroAdministrativo. Altere no trecho a seguir o código:

...

public void doFilter(ServletRequest request,

ServletResponse response,

FilterChain chain)

throws IOException, ServletException {

HttpSession session = ((HttpServletRequest)request).getSession();

String logado = (String)session.getAttribute("logado");

//verifica se logado não existe

if(logado==null){

//envia uma mensagem caso o usuário

//tente entrar em alguma área administrativa

//sem estar logar

session.setAttribute("msg","Efetue o login no sistema");

//redireciona para a página de login

((HttpServletResponse)response).sendRedirect("../Page1.jsp");

}else{

chain.doFilter(request, response);

}

}

...

O Filtro Servlet faz todos seus processos no método de doFilter, por esta razão fora nele que nós adicionamos o código para que seja verificada a sessão chamada de ”logado”.

Caso a sessão não exista, ela retorna um valor null. Ocorrendo isso, o método sendRedirect é chamado e a página de login e senha (Page1.jsp) é mostrada.

A configuração

Após criar o Filtro Servlet, será necessário configurarmos o tempo que a sessão permanecerá e em que local será criada.

Na janela Projetos, expanda o item Arquivos de Configuração e dê um duplo clique em web.xml.

Em Geral, no deployment descriptor, aberto no NetBeans, altere o Tempo-limite da Sessão adicionando o número 30, que equivale a 30 minutos e tempo da sessão.

Expanda Parâmetros do Contexto e selecione o primeiro parâmetro, chamado de javax.faces.STATE_SAVING_METHOD. Clique no botão Editar, logo abaixo.

Figura 5

Na caixa de diálogo Editar Parâmetro do Contexto, altere para client no campo Valor do Parâmetro e confirme no botão OK.

Figura 6

Quando o estado da sessão é salvo no lado cliente, o JavaServer Faces cria um campo oculto na página, transmitindo assim a sessão de um lado para o outro.

Salvem todas as alterações.

Rodando a aplicação

Execute a aplicação através do botão Executar o Projeto Principal ou pelo atalho F6.

Observe que se tentarmos entrar com um login e senha inválidos, haverá uma mensagem de erro. O mesmo ocorre caso não seja preenchido nada em um dos dois campos ou nos dois ao mesmo tempo.

Figura 7

Quando logar, você tem livre acesso a área administrativa. Inclusive pela barra de endereços.

Criando o código para o logout do sistema

O que resta agora é criar o código para remover a sessão quando clicarmos no link “Logout”. Dêem um duplo clique no link criado na admin/Page2.jsp.

Figura 8

Adicionem o código mostrado a seguir:

public String logout_action() {

FacesContext fc = FacesContext.getCurrentInstance();

HttpSession session =

(HttpSession)fc.getExternalContext().getSession(false);

//expira a sessão

session.invalidate();

return "logout";

}

Com o método invalidade, sua sessão acaba e faz com que o usuário tenha que se logar novamente.

Exibindo uma mensagem de erro disparada pelo Filtro

Quando o usuário estiver tentando entrar em uma área administrativa, diretamente pela barra de endereços, não só podemos redirecioná-lo, como está ocorrendo atualmente, mas também capturar a mensagem de erro lançada pelo Filtro e exibi-la.

if(logado==null){

//envia uma mensagem caso o usuário

//tente entrar em alguma área administrativa

//sem estar logar

session.setAttribute("msg","Efetue o login no sistema");

Voltando a Page1.jsp, na entrada de login e senha, clique no terceiro botão, Java, na parte superior.

No método prerender e adicionem o código mostrado a seguir:

public void prerender() {

//exibe a mensagem caso o usuário tente entrar na área

//administrativa sem se logar

FacesContext fc = FacesContext.getCurrentInstance();

HttpSession session =

(HttpSession) fc.getExternalContext().getSession(false);

String msg = (String)session.getAttribute("msg");

if(msg!=null)

error(msg);

}

Salve e rode novamente a aplicação. Se tentarmos entrar em uma área protegida do sistema, uma mensagem surgirá, avisando do problema.

Figura 9

E para que, esta mensagem não fique persistente:

Figura 10

Volte ao código do botão Logar e adicione o trecho mostrado a seguir:

//caso a sessão msg esteja com valor, a remove

if(session.getAttribute("msg")!=null)

session.removeAttribute("msg");

Com mais detalhes onde será posicionado:

...

if(senha.getText().equals((String) usuariosDataProvider.getValue("usuarios.password"))){

//captura a sessão do contexto criado

//pelo JavaServer Faces do VWP

FacesContext fc = FacesContext.getCurrentInstance();

HttpSession session = (HttpSession)fc.getExternalContext().getSession(false);

//cria uma sessão contendo o nome de usuario chamada logado

session.setAttribute("logado", usuario.getText() );

//caso a sessão msg esteja com valor, a remove

if(session.getAttribute("msg")!=null)

session.removeAttribute("msg");

//redireciona para a área administrativa

return "logado";

}

...

Pessoal, isso é tudo. Espero que tenham gostado dessa série e aguardem as próximas.

Abraços a todos e bons códigos.

Referências

Em inglês e Português sobre o Visual Web Pack

http://www.netbeans.org/kb/55/vwp-index_pt_BR.html?1

Em inglês sobre Servlet Filtros (Filters)

http://java.sun.com/products/servlet/Filters.html

Artigo em inglês sobre Servlet Filtros (Filters)

http://www.javaworld.com/javaworld/jw-06-2001/jw-0622-filters.html

Em livro, para aprender Visual Web Pack

Desenvolvendo aplicações Web com NetBeans IDE 5.5 – Edson Gonçalves – Editora Ciência Moderna - 2007.
Edson Gonçalves

Edson Gonçalves - Desenvolvedor analista, colaborador, pesquisador e escritor. Diretor Técnico da empresa Integrator Technology and Design, é responsável pela área de desenvolvimento de sistemas, tanto em ambiente Cliente/Servidor como em sistemas distribuídos. Profundo conhecedor de linguagens para o desenvolvimento Web como Java, C#, Ruby, Python e PHP 5, atualmente dedica boa parte de seu tempo livre para escrever livros e artigos. Colaborador do DFJUG (Brasilia Java Users Group) nas horas vagas, como escritor já lançou oito livros, entre eles Desenvolvendo aplicações Web com JSP, Servlets, JavaServer Faces, Hibernate, EJB3 Persistence e AJAX e Desenvolvendo Aplicações Web com NetBeans IDE 5.5, ambos encontrados aqui na Linha de Código.