Cursos / Informática para Internet / Desenvolvimento Web I / Aula

arrow_back Aula 04 - Trabalhando com sessões

Sessões de usuário

Para implementar o sistema de autenticação que lhe apresentamos, faremos uso do conceito de sessão do usuário. A ideia de sessão é basicamente a de manter o estado do cliente (ou melhor, das informações sobre o cliente) no próprio servidor. Lembre-se de que na aula anterior o estado do cliente (dados pessoais, profissionais e bancários) ficava no lado cliente, ou seja, no navegador web. Usamos os campos ocultos para isso, não foi? Caso o navegador do cliente fosse fechado, perderíamos todos os dados.

Pois bem, para manter o estado do cliente no lado do servidor, precisamos de uma classe Java para representar esse estado. O nome dessa classe (na verdade, interface) é javax.servlet.http.HttpSession. Cada usuário deverá ter um e apenas um objeto do tipo HttpSession para representar o seu estado (informações). Um usuário, para nós, é um programa que está acessando o servidor, ou seja, geralmente um navegador web (cliente do servidor) que está sendo operado por um ser humano (o cliente do negócio, consumidor de uma loja virtual, etc.).

Para criar um objeto sessão para representar um cliente, você deve fazer uso do método getSession() da classe HttpServletRequest. Esse método tem o seguinte comportamento:

  • se não existe nenhum objeto sessão para representar o cliente web em atendimento, esse método cria um objeto do tipo HttpSession e relaciona esse objeto ao cliente web em questão;
  • caso já exista um objeto sessão relacionado ao cliente web, esse método simplesmente retorna o objeto.

Você pode estar se perguntando agora como é que se relaciona um objeto a um cliente web. Vamos pensar bem, se tivermos 30 usuários acessando o sistema ao mesmo tempo, quando chega uma requisição web, como podemos identificar um determinado usuário? Uma primeira solução seria observar o endereço IP da máquina do cliente (forma de endereçamento dos computadores na Internet). Isso pode ser visto no código mostrado na Listagem 1. A classe HttpServletRequest possui vários métodos para acessarmos informações sobre a requisição. Uma dessas informações é o endereço IP ou nome do host de onde vem a requisição (ver métodos getRemoteAddr() e getRemoteHost() da Listagem 1).

Listagem 1 - Servlet que mostra informações sobre máquina do cliente

Porém, esses métodos getRemoteAddr() e getRemoteHost() só serão úteis para identificar os clientes web em alguns casos, quando seu Servlet estiver rodando em um servidor web e os clientes web rodando em máquinas na Internet com IP real. Por exemplo, se várias máquinas estão conectadas a um roteador e esse roteador está conectado à internet, os acessos de todas essas máquinas irão aparecer com o IP do roteador diretamente ligado à internet, pois apenas o seu IP é que é “real” (visível por outras máquinas da internet). Isto pode ser visto através da Figura 4, que mostra o IP de um roteador que liga 3 computadores à internet. Apenas o IP externo/real (no exemplo, o IP 10.5.8.104) do roteador é visível. Nem o IP interno do roteador nem o dos computadores são visíveis pelos servidores web que rodam na Internet.

IP real e virtual

A saída encontrada para o problema de identificação do cliente web é dada pelos chamados cookies (biscoitos, em inglês). Os cookies HTTP são pequenos textos armazenados no navegador web. O texto de um cookie consiste em um ou mais pares de identificador/valor. Um exemplo seria guardar em um cookie do navegador o texto ID=231122, onde o valor 231122 foi gerado aleatoriamente pelo servidor para representar aquele cliente específico. Uma vez criado o cookie no navegador, ele será enviado para o servidor durante toda a comunicação a ser realizada com ele. Dessa forma, ao receber uma requisição, o servidor poderá identificar o cliente pelo ID armazenado no cookie do cliente. Visualize este processo através da Figura 5.

Uso de cookies para identificar usuário ao longo da comunicação web

De fato, cada cookie está associado a um determinado sítio na internet. Sendo assim, o sistema do Banco do Brasil, por exemplo, pode gerar um número aleatório para um usuário após ele ter sido autenticado e mandar esse identificador para ser armazenado no navegador web. Reforçando, em todo acesso que for feito dali em diante, o navegador web irá enviar esse identificador para o servidor. Dessa forma, o servidor poderá saber qual usuário está acessando o sistema naquele momento. Ficou claro? Esse número aleatório que é gerado para cada usuário é, basicamente, o identificador único da sessão do usuário. Por questões de segurança, cada servidor só poderá ler os cookies associados ao seu domínio.

Vamos voltar novamente para a criação dos objetos HttpSession. Ao ser executado, o método getSession() irá, de forma automática (ou seja, é tudo transparente para o programador), enviar na resposta do Servlet uma instrução indicando um cookie que deverá ser criado, cujo valor é um identificador único para o cliente e o qual será utilizado nas demais requisições para fazer a identificação desse cliente. Dessa forma, quando usamos sessões, estamos dizendo para o servidor e o navegador web criarem um vínculo, e isso tudo é feito de forma transparente e automática para nós!

Vamos ver agora esse assunto em prática. Vejamos como pode ser implementada a funcionalidade de autenticação (login) do usuário no exemplo a seguir.

Versão 5.3 - Todos os Direitos reservados