Na maioria dos sistemas web é necessário o controle de acesso a algumas áreas da aplicação. O objetivo desse artigo é justamente mostrar uma forma simples de fazer esse controle, utilizando os filtros da API Servlet.

Faremos uma aplicação simples com um formulário de login e uma pagina jsp protegida, vejamos abaixo.

Banco de dados

Criaremos primeiramente um banco de dados, com uma tabela usuarios, onde serão cadastrados os usuários da nossa aplicação. Nesse exemplo utilizaremos o banco de dados MySQL, execute o seguinte script no console do MySQL:


            CREATE DATABASE javamagazine1;

 
USE javamagazine1;


CREATE TABLE usuarios (

  id INT(11) NOT NULL auto_increment,

  nome varchar(100) DEFAULT NULL,

  login varchar(50) DEFAULT NULL,

  senha varchar(50) DEFAULT NULL,

  PRIMARY KEY  (id)

);

 
INSERT INTO usuarios (nome, login, senha) VALUES ('Administrador', 'admin', '1234');

        

Estrutura básica

Criaremos também as pastas básicas da aplicação com a seguinte estrutura, dentro da pasta webapps do Tomcat:

Estrutura das pastas

O Usuário

Um usuário do banco de dados será representado por um objeto da classe Usuario, crie ela no pacote br.com.javamagazine.jairelton1:


            package br.com.javamagazine.jairelton1;

 
import java.io.Serializable;

 
public class Usuario implements Serializable{

     private int id;

     private String nome;

     private String login;

     private String senha;

 

     public int getId() {

         return id;

     }

     public void setId(int id) {

         this.id = id;

     }

     public String getLogin() {

         return login;

     }

     public void setLogin(String login) {

         this.login = login;

     }

     public String getNome() {

         return nome;

     }

     public void setNome(String nome) {

         this.nome = nome;

     }

     public String getSenha() {

         return senha;

     }

     public void setSenha(String senha) {

         this.senha = senha;

     }
    

}
        

JSP’s

Dentro da pasta admin criaremos uma pagina JSP chamada index.jsp, que será protegida por senha, o código dela é mostrado abaixo:


            <%@ page language="java" contentType="text/html; charset=ISO-8859-1"

    pageEncoding="ISO-8859-1"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title>Logado</title>

</head>

<body>


<h3>Olá <%=((br.com.javamagazine.jairelton1.Usuario)session.getAttribute("usuario")).getNome() %>, você está logado no sistema!</h3>

 
</body>

</html>
        

Dentro da pasta webapps/JavaMagazine criaremos um arquivo index.jsp que será o formulário de login, o código é o seguinte:


            <%@ page language="java" contentType="text/html; charset=ISO-8859-1"

    pageEncoding="ISO-8859-1"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title>Login</title>

<style type="text/css">

      *{

            font-family: Verdana, Arial;

      }

      table{

            background-color: #EEEEEE;

            border: solid #CCCCCC 1px;

      }

      th{

            background-color: #CCCCCC;

            color: #FFFFFF;

      }

      .campo{

            border: solid #CCCCCC 1px;

      }

</style>

</head>

<body>

<form method="POST" action="Logar">

<table>

<tr>

      <th colspan="2">Login</th>

      </tr>

      <tr>

      <td>Login: </td>

      <td><input class="campo" type="text" name="login" /></td>

      </tr>

      <tr>

      <td>Senha: </td>

      <td><input class="campo" type="password" name="senha" /></td>

      </tr><%  String[] erros = {"Usuario ou senha incorretos!", "Você não está
                   logado!"};

                String erro = request.getParameter("erro");

                if(erro!=null){%>

<tr>

<td  colspan="2"><%=erros[Integer.parseInt(erro)-1]
          %></td>

</tr> <% } %>

<tr>

<td colspan="2" align="center"><input type="submit" value="Entrar" /></td>

      </tr>

</table>

</form>

</body>

</html>
        

Servlet

Será necessário também um Servlet que se conecte com o banco de dados e verifique os dados digitados, então criaremos um:


            package br.com.javamagazine.jairelton1;


import java.io.IOException;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class Logar extends javax.servlet.http.HttpServlet{

     protected void doPost(HttpServletRequest request, HttpServletResponse
         response) throws ServletException, IOException {

         Connection conexao = null;

         PreparedStatement stmt = null;

         ResultSet res = null;

         try{

              String login = request.getParameter("login");

              String senha = request.getParameter("senha");

              Class.forName("com.mysql.jdbc.Driver");

              conexao = DriverManager.getConnection("jdbc:mysql://localhost/javamagazine1", "root", "senha");

              stmt = conexao.prepareStatement("SELECT * FROM usuarios WHERE login=?");

              stmt.setString(1, login);

              res = stmt.executeQuery();

              Usuario usuario = null;

              if(res.first()){

                   usuario = new Usuario();

                  usuario.setId(res.getInt("id"));

                   usuario.setNome(res.getString("nome"));

                   usuario.setLogin(res.getString("login"));

                   usuario.setSenha(res.getString("senha"));

              }

              if(usuario==null||!usuario.getSenha().equals(senha)){

                   request.getSession().setAttribute("msg", "Login ou senha incorretos!");

                   response.sendRedirect("index.jsp");

              }else{

                   request.getSession().setAttribute("usuario", usuario);

                   response.sendRedirect("admin/index.jsp");

              }

         }catch(Exception e){

              throw new ServletException(e);

         }finally{

              try{

                   res.close();

                   stmt.close();

                   conexao.close();

              }catch(Exception e){

                   e.printStackTrace();

              }

         }

     }            

}
        

Configuração

Agora vamos configurar o arquivo web.xml (webapps/JavaMagazine/WEB-INF/web.xml), declare o Servlet como abaixo:


            <?xml version="1.0" encoding="UTF-8"?>

<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

      <display-name>JavaMagazine1</display-name>

      <servlet>

            <description></description>

            <display-name>Logar</display-name>

            <servlet-name>Logar</servlet-name>

            <servlet-class>br.com.javamagazine.jairelton1.Logar</servlet-class>

      </servlet>

      <servlet-mapping>

            <servlet-name>Logar</servlet-name>

            <url-pattern>/Logar</url-pattern>

      </servlet-mapping>

      <welcome-file-list>

            <welcome-file>index.jsp</welcome-file>

      </welcome-file-list>

</web-app>
        

Teste

A aplicação já deve funcionar agora, compile as classes e execute no browser, http://localhost:8080/javamagazine/, será exibida a tela de login, ao digitar o login “admin” e senha “1234” será exibida a tela protegida adequadamente, mas verifique que mesmo sem logar a pagina jsp admin/index.jsp pode ser visualizada, isso porque ainda não definimos nenhuma restrição para isso.

O filtro

Os filtros da API servlet são responsáveis por interceptar a chamada a certo recurso, fazer algum processamento e liberá-la ou não.

Utilizaremos eles hoje para interceptar as chamadas para os Servlet’s e JSP’s de uma área restrita de nossa aplicação, a área será definida pelo prefixo /admin (a pasta admin criada acima), nesse caso seria uma área de administração, por exemplo, com conteúdo restrito.


            package br.com.javamagazine.jairelton1;

 
import java.io.IOException;

 
import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class FiltroSeguranca implements Filter {

 

      public void init(FilterConfig config) throws ServletException {


      }

 

      public void doFilter(ServletRequest req, ServletResponse res,

                  FilterChain chain) throws IOException, ServletException {

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

            Usuario usuario = (Usuario)session.getAttribute("usuario");

            if(usuario==null){

                  session.setAttribute("msg","Você não está                              logado no sistema!");

                  ((HttpServletResponse)res).sendRedirect("../index.jsp");

            }else{

                  chain.doFilter(req, res);

            }

      }

 

      public void destroy() {


      }

}
        

Edite o arquivo web.xml e adicione as seguintes linhas abaixo de </welcome-file-list>


            <filter>

                <filter-name>Filtro Seguranca</filter-name>
    
                <filter-             class>br.com.javamagazine.jairelton1.FiltroSeguranca</filter-class>
    
          </filter>
    
          <filter-mapping>
    
                <filter-name>Filtro Seguranca</filter-name>
    
                <url-pattern>/admin/*</url-pattern>
    
          </filter-mapping>

        

Finalizando

Acesse novamente o endereço http://localhost:8080/JavaMagazine1/admin/index.jsp, dessa vez não será possível acessar a página sem antes logar.

O processo

Ao fazer uma requisição a /admin/index.jsp o pattern bate com o configurado no filter-mapping, assim é chamado primeiramente o filtro, no método doFilter() é verificada a existência do atribute “usuario” na sessão, caso exista é porque o usuário está logado, então o método doChain() libera a execução do Servlet, caso o atributo seja nulo, o usuário é redirecionado para a pagina de login, e o Servlet (JSP) sequer é executado. E eis que surge nosso sistema de login.