1. Cookies armazenam informações do cliente no navegador e são usados para identificar usuários e customizar sites.
2. A sessão HTTP mantém informações entre requisições de um mesmo usuário através de cookies, campos escondidos ou reescrita de URLs.
3. A API HttpSession simplifica o rastreamento de sessões gerando IDs únicos e armazenando atributos para cada usuário.
1. Programação Server Side I
Aula 2
Cookies
Prof. Elton R C Spode, MsC
E-mail: espode@brturbo.com
http://www.inf.unifra.br/~espode
2. Cookies
• São pequenas seqüências de bits armazenadas no
cliente pelo browser
• Surgiram no Netscape para guardar informações
persistentes no cliente
• Existem restrições para o seu uso:
– Podem ser acessados apenas pelo domínio que os
criou
– Podem ser desabilitados pelo usuário (privacidade)
• Cookies são enviados de volta sempre que o usuário
retorna ao domínio que gravou-os
3. Aplicações de Cookies
• Os usos mais comuns de cookies são:
– Identificação de usuários durante uma sessão de
comércio eletrônico
– Diminuir a necessidade de solicitação de senhas para
o usuário
– Customização de sites de acordo com as preferências
de cada visitante
– Propaganda dirigida
• Como cookies são gravados como arquivos texto eles
não representam ameaça à segurança do usuário,
apenas à sua privacidade
4. Criação de Cookies
• Para criar um cookie:
– Criar um objeto da classe Cookie passando o nome
do cookie e seu valor
– Indicar o tempo de validade do cookie (em segundos)
com o método setMaxAge. Se não for indicado
nenhum, o cookie é valido até que o browser seja
fechado
– Enviar o cookie para o cliente usando o método
addCookie do objeto response
• Mesmo que sejam criados vários cookies, todos eles
serão gravados em apenas um arquivo
5. Criação de Cookies (cont.)
• O nome do cookie não pode conter os seguintes
caracteres: [ ] ( ) = , “ / ? @ : ;
• O conteúdo do cookie não pode conter o ;
• Criando um cookie com a duração de 1 hora:
Cookie cookie = new Cookie(“nome”, “João”);
cookie.setMaxAge(60*60);
response.addCookie(cookie);
• Se o cookie não existir, será criado. Caso contrário será
alterado.
• Também podem ser criados cookies inserindo-se as
Headers adequadas no objeto response.
6. Leitura de Cookies
• Todos os cookies referentes ao domínio que está
sendo solicitado são automaticamente enviados
juntos com a requisição
• Eles estão disponíveis no objeto request e
podem ser recuperados com getCookies
• Este método retorna um array de cookies
• Para recuperar um cookie específico é
necessário fazer a varredura do array
comparando o nome procurado com
cookie.getName
7. Cookies API
• A API de cookies possui métodos para assinalar
e pegar atributos disponíveis no cookie:
• set/getComment
• set/getDomain
• set/getMaxAge
• set/getName
• set/getPath
• set/getSecure
• set/getValue
• set/getVersion
8. Cookies API (cont.)
• Alguns métodos são de interesse especial:
• setDomain - altera o domínio do cookie mas não
pode ser usado livremente, apenas em situações
bem específicas.
• setPath -altera o path para o qual o cookie se
aplica. Em geral é utilizado na forma:
cookie.setPath(“/”);
• Este comando indica que todas as páginas neste
servidor devem receber o cookie de volta.
9. Exercício
• Alterar o servlet LoginServlet para gravar o id do
usuário em um cookie. Caso o cookie já exista
não solicitar a senha, apenas redirecionar para o
CadastroServlet
10. Sessão
• O protocolo HTTP é “stateless”, ou seja, ele não
mantém informações entre conexões
• Após a resposta ser enviada a uma requisição, a
conexão é fechada
• Entretanto, é comum o envio de requisições
interligadas por um mesmo cliente, como
operações de conta corrente ou compras
• Este conjunto de requisições e respostas é
chamado de sessão
11. Rastreamento de Sessões
• Para atingir o objetivo de ligar conexões é necessário
rastrear cada sessão, ou seja, verificar a qual usuário
pertence cada requisição
• Este método de rastreamento consiste em:
– Associar cada requisição recebida com uma sessão
específica
– Se for uma nova sessão, gerar um identificador único
para ela
– Recuperar dados da sessão (produtos comprados por
exemplo) de um conjunto (lista, tabela hash, etc)
12. Rastreamento de Sessões
• Este controle pode ser feito “manualmente”
através do uso de cookies.
• Como o usuário pode desabilitar os cookies em
sua máquina, os processos alternativos são: uso
de campos escondidos em formulários HTML ou
através de reescrita de URLs
• Entretanto, como este é um processo comum e
trabalhoso, existe uma API que realiza todo o
tratamento de maneira simples e transparente
para o programador: HttpSession
13. Campos Escondidos
• Consiste na inserção do id único do usuário em cada
página gerada através do uso de campos escondidos:
<input type=“hidden” name=“id” value= “...”>
• O id é então recuperado através do getParameter
• Este método apresenta duas desvantagens:
– Só funciona para páginas geradas dinamicamente pois
o id deve ser inserido no HTML
– É obrigatório o uso de forms com botões, não sendo
possível o uso de links para páginas que façam parte
da sessão
14. Reescrita de URLs
• Neste método, o id da sessão de cada usuário é
adicionado ao fim de toda URL:
http://www.xyz.com;id=563248712354
• Para recuperá-lo, também utiliza-se método
getParameter
• Funciona em qualquer browser, mesmo se o
usuário desabilitar os cookies
• Entretanto se o usuário acessar a mesma página
através de um outro link ou bookmark, a sessão
será perdida
15. Cookies
• Para cada nova requisição, um cookie com o id da
sessão é gravado no browser do cliente
• O id é recuperado através do cookie
• Se puder ser usada, é a melhor solução pois funciona em
todos os casos.
• Como desvantagem, temos a tarefa relativamente
trabalhosa de:
– Extrair o cookie de id do array
– Assinalar um tempo de validade adequado
– Associar cada requisição com uma sessão
– Gerar os ids únicos
16. HttpSession API
• Para simplificar o rastreamento de sessões utilizamos a
interface HttpSession que realiza as seguintes tarefas de
maneira transparente:
– Gera ids únicos
– Mantém informações de todas as sessões atuais
– Associa requisições com suas respectivas sessões
– Utiliza o método de rastreamento disponível para cada
usuário: cookies se estiverem habilitados ou reescrita
de URLs
– Possibilita o armazenamento de objetos na sessão
– Descarta sessões completas ou abandonadas
17. Criando e Recuperando
Sessões
• Para recuperar uma sessão utiliza-se o método
getSession do objeto request:
HttpSession session = request.getSession();
• Se não existir sessão o método retorna null
• Para criar uma sessão deve-se usar:
HttpSession session =
request.getSession(boolean criar);
• Se o parâmetro for true uma sessão será criada
caso não exista, se for false o método retornará
null como no caso anterior
• Para verificar se ela é nova usa-se isNew()
18. Inserindo um Atributo
• Para inserir atributos deve-se usar os métodos
setAttribute (2.2) e putValue de HttpSession
• Sintaxe:
void putValue(String nome, Object
Valor);
• Objetos inseridos com este método estarão
disponíveis até que a sessão do usuário
correspondente termine
• Como cada usuário terá sua própria sessão, esta
é uma excelente maneira de armazenar e
organizar os dados de cada um
19. Recuperando Atributos
• Para recuperar atributos da sessão, usa-se getAttribute
(2.2) e getValue de HttpSession
• Sintaxe:
Object getValue(String nome);
• Se o atributo não existir, será retornado null
• Para se recuperar todos os atributos associados com
uma sessão, usa-se getAttributeNames(2.2) ou
getValueNames
• Sintaxe:
Enumeration getAttributeNames();
String [] getValueNames();
20. Descartando Sessões
• Quando o usuário terminar sua sessão, deve-se
eliminá-la usando o método invalidate()
• Sintaxe:
void invalidate();
• Este método finaliza a sessão e retira a ligação
de todos os objetos anteriormente associados
• Repare que ele não libera os objetos associados,
apenas elimina suas ligações
21. Outros Métodos
• removeAtribute - elimina o atributo da sessão
• getId - recupera o ID único gerado
• getCreationTime - recupera a hora de criação da
sessão em milisegundos
• getLastAccessedTime - recupera o último acesso
a esta sessão em milisegundos
• setMaxInactiveInterval - altera o tempo de
inatividade em que uma sessão será invalidada
• getMaxInactiveInterval - recupera o tempo de
inatividade
22. Codificação de URLs
• O HttpSession escolherá o método de reescrita
de URLs caso não possa usar cookies
• Neste caso, o id da sessão será adicionado a
toda URL requisitada
• Nas respostas enviadas pelos servlets é comum
a inserção de URLs em links, ações de
formulários ou em redirecionamentos
• Para o correto funcionamento da sessão é
necessária a inserção do id nestas URLs
• Usam-se os métodos do objeto response:
encondeURL e encodeRedirectURL
23. URLs em Links
• Para codificar URLs do próprio site que serão
colocadas em links ou em ações de formulários
utiliza-se o método encodeURL
• Sintaxe:
String encodeURL(String URL);
• Exemplo:
String novaURL = response.encodeURL(URL);
out.println(“<a href=” + novaURL + ”>Clique
aqui </a>);
24. URLs em sendRedirect
• Para os casos em que a requisição deva ser
redirecionada para outra URL no mesmo site
usa-se encodeRedirectURL
• Sintaxe:
String encodeRedirectURL(String
URL);
• Exemplo:
String URL =
response.encodeRedirectURL(URL);
response.sendRedirect(novaURL);
25. Exercício
• Completar o sistema: Cada opção chamada do
menu deverá operar sobre a conta corrente atual.