Servlet filter de autenticação

Servlet Filter da API de Servlets é um componente que intercepta uma requisição e pode executar comandos antes e depois de ela ser tratada por um Servlet. Um filtro precisa implementar a interface Filter, que possui os métodos init(), destroy() e doFilter(). O método doFilter(), que é chamado quando uma requisição é interceptada, possui um parâmetro do tipo FilterChain, que representa a cadeia de filtros que está processando esta requisição.

Ao receber uma requisição, o servlet filter pode fazer algum pré-processamento e, em seguida, ao chamar o método doFilter() da instância da classe FilterChain, invocar o próximo filtro ou o Servlet que irá tratá-la. Quando esse método doFilter() retorna, o filtro retoma o controle e pode realizar algum pós-processamento na requisição.

O uso de filtros é uma opção interessante quando se está implementando uma aplicação web. Características não-funcionais, ou seja, que não são diretamente relacionadas com regras de negócio, são excelente candidatas para serem implementadas dentro de filtros.

Dentro dessa categoria, estão incluídas verificações de segurança para procurar parâmetros maliciosos em uma requisição. Neste artigo, foram vistos exemplos de filtros que fazem verificações de segurança e como podem ser configurados para interceptar a execução de um Servlet no deployment descriptor de uma aplicaçãoweb. Segue uma lista de vantagens do uso de filtros:

  • Desacopla os aspectos não-funcionais das regras de negócio.
  • Evita duplicação de código, visto que um filtro pode interceptar requisições de diversos Servlets.
  • Pode ser reutilizado em várias aplicações, pois sua execução é transparente para os Servlets.
  • Pode ser habilitado e desabilitado com configurações no deployment descriptor.

Servlet Filter de autenticação de usuário

package filter;

import java.io.IOException;
import java.sql.Connection;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import user.UserLogado;
import connection.ConnectionDataBase;
import connection.ConnectionDataBaseBanco2;
import connection.ConnectionDataBaseMySQL;

@WebFilter(urlPatterns={"/pages/*"})    
public class FilterAutenticacao implements Filter{ 
	
	private static Connection connection;
	private static Connection connectionBanco2;
	private static Connection connectionBancoMysql;
 
	//faz alguma coisa quando a aplicação é derrubada
	@Override
	public void destroy() {
		
	}

	//intercepta todas as requisições
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
			HttpServletRequest req = (HttpServletRequest) request;
			HttpSession session = req.getSession();
			
			String urlParaAutenticar = req.getServletPath();	
			// retorna null caso não esteja logado
		    UserLogado userLogado = (UserLogado) session.getAttribute("usuario");
		    
		    if (userLogado == null && !urlParaAutenticar.
		    		equalsIgnoreCase("/pages/ServletAutenticacao")){ // usuário não logado
		    	RequestDispatcher dispatcher = request.
		    			getRequestDispatcher("/autenticar.jsp?url="+urlParaAutenticar);
		    	dispatcher.forward(request, response);
		    	return;// para o processo para redirecionar
		    }
	 	
			// executa as ações do request e response
			chain.doFilter(request, response);
		
	}

	// executa alguma coisa quando a aplicação é iniciada
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		connection = ConnectionDataBase.getConnection();
		connectionBanco2 = ConnectionDataBaseBanco2.getConnection();
		connectionBancoMysql = ConnectionDataBaseMySQL.getConnection();
	}

}

Vamos entender o que o nosso servlet filter de autenticação está fazendo. Basicamente nós pegamos a url que está sendo requisitada e fazemos a seguinte validação:

  • Verifica se o usuário está logado.
  • Caso não esteja logado e a url da requisição for diferente de autenticação, então redireciona para a autenticação obrigatoriamente.
  • Após autenticar redirecione para a url que o usuário estava tentando acessar.
  • E se o usuário está logado continua o processamento normalmente.

Apesar desta implementação ser um modo antigo de segurança em aplicações, é extremamento útil saber implementar um filtro manualmente.

Curso que recomendo para você

Selecionamos uma série de cursos on-line para você se preparar e abrir as portas para as vagas de programação. Conheça cada um dos cursos nos links oficiais abaixo.

Rotinas avançadas para o dia a dia web
Top 10 Java EE
Ensinaremos passo a passo o desenvolvimento de rotinas avançadas e super importantes em Java Web.
536 alunosHoras do curso 15h Horas do curso certificado
Promoção R$ 49
5x de R$ 10,54
Todo programador deve dominar as seguintes técnicas em desenvolvimento de sistemas abordadas por este curso completo.
Aprenda a configurar o seu ambiente JAVA
Ambiente JAVA
Construindo o seu próprio ambiente de desenvolvimento. Principais habilidades de configuração de ambientes.
952 alunosHoras do curso 3h
Promoção Gratuito
Java é uma linguagem de programação e plataforma computacional lançada pela primeira vez pela Sun Microsystems em 1995. O Java é rápido, seguro e confiável. De laptops a datacenters, consoles de games a supercomputadores científicos, telefones celulares à Internet, o Java está em todos os lugares.

 


Acesse
Cursos e Projetos
Java
Acesse
Outros Cursos
PHP MySQL Android
Acesse
Encomende um Projeto
Feito pra Você
Acesse
Tire as Dúvidas On-line
Consultor
Acesse
Aulas de Java só suas
Encomende Agora
Acesse
Dividindo Conhecimento
Posts e Tutoriais
Acesse
Sites e Parceiros
Associados
Acesse
Conheça os curso gratuitos
Grátis

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Instrutor Java Quer se tornar aluno VIP? CLIQUE AQUI!
Instrutor Java

Alex Fernando Egidio
Autor, criador e fundador do Java Avançado Cursos TI. Atua no mercado como desenvolvedor e engenheiro de sistemas em Java é apaixonado por desenvolvimento web em Java e pela “mágica” que seus frameworks trazem para o dia a dia de nós desenvolvedores.
Com mais de 10 anos de experiência ajuda programadores do Brasil todo a se tornarem profissionais.