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çalvesOlá 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