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
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
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
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
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.
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
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
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.
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
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
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)
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
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
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
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
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
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()
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
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();
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
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
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
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>);
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);
Exercício
• Completar o sistema: Cada opção chamada do
  menu deverá operar sobre a conta corrente atual.

Programação Server Side I - Aula 2

  • 1.
    Programação Server SideI Aula 2 Cookies Prof. Elton R C Spode, MsC E-mail: espode@brturbo.com http://www.inf.unifra.br/~espode
  • 2.
    Cookies • São pequenasseqüê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 • AAPI 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 oservlet 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 protocoloHTTP é “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 • Consistena 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 cadanova 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 • Parasimplificar 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 • Pararecuperar 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 • Quandoo 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 osistema: Cada opção chamada do menu deverá operar sobre a conta corrente atual.