Sessões Cookies HTTP Sessões Atributos de sessão O problema O protocolo HTTP não mantém estado entre transações distintas Ao término do atendimento da requisição, a conexão TCP é fechada pelo servidor Toda requisição é vista como nova e nunca como continuação de uma anterior Problema Como implementar aplicações que necessitam de estado entre transações HTTP distintas, tais como, carrinhos de compras, web-mail, etc? O problema Exemplo: uma sessão de web-mail. Cookies Problema Como fazer o servidor "entender" que a terceira transação HTTP é um pedido de listagem de um usuário que já se logou no sistema? A Netscape definiu o conceito de cookie Um cookie é um pedaço de informação importante O servidor envia o cookie para o cliente O cliente mantém o cookie em memória ou disco Cada vez que o cliente se conectar com o servidor devolve o cookie para ele Cookies Exemplo: Depois que o login do usuário foi validado com sucesso. Cookies Exemplo: Ao solicitar a listagem das mensagens, o browser envia o cookie de identificação do cliente Sessões e Cookies Cookie é uma forma de implementar sessões no HTTP Cookies Problemas com esse mecanismo: É chato ficar tendo que identificar o cookie com a identificação dos outros cookies existentes; Deve-se definir datas de expiração para o cookie (não é automático); É dever do programador criar estruturas que associem objetos de negócio com a sessão criada pelo cookie; É dever do programador gerar os números de identificação únicos para cada sessão; A API possui objetos para lidar com cookies HTTP em alto nível. Reescrita de URL Outra forma de implementar sessões no protocolo HTTP Um identificador é anexado a toda URL trocada entre o browser e o cliente http://servidor:8080/recurso?jsessionid =123 Qualquer URL que o servlet produza como parte da resposta deve ter a identificação anexada O browser não trata essa identificação, apenas a devolve intacta no final da URL "Ping-pong" de identificador! Reescrita de URL Problemas com esse mecanismo: É chato ficar anexando identificadores em todas as URLs O mecanismo de identificação da sessão é feito pelo programador É dever do programador criar estruturas que associem objetos de negócio com a sessão criada pelo mecanismo de reescrita A API de servlets possui métodos para gerar os identificadores de URL automaticamente Resumo: Cookies e Reescrita Sessões em servlets A interface HttpSession define um objeto de sessão O objeto da requisição é responsável por criar uma nova sessão ou devolver a sessão atualmente aberta: HttpSession sessao = request.getSession(true); HttpSession sessao = request.getSession(); Ou então devolver null se a sessão não existir: HttpSession sessao = request.getSession(false); A próxima requisição fará parte da sessão aberta por este servlet Atributos de sessão O mecanismo de sessões apenas identifica a qual cliente pertence a sessão Quaisquer dados associados ao cliente precisam ser mantidos no servidor pelo programador Ex: produtos já comprados numa sessão de compras ou permissões e outras informações Métodos para ler/criar/remover atributos de sessão Object getAttribute (String nome) void setAttribute (String nome, Object atributo) void removeAttribute (String nome) Atributos de sessão Exemplo do carrinho de compras Atributos de sessão Trecho de código no doGet() de CompraServlet ! " #$ % $ " & Atributos de sessão Exemplo de webmail Atributos de sessão Trecho de código no doGet() de LoginServlet ' $$ ( ) ! * + $ $ " , " ! + $ ) Atributos de sessão Trecho de código no doGet() de AbreMsgServlet - !. ( / + ' 0 ! " ) ) ' $ ) 12 ! ! *34! Finalização de sessões Quando não se deseja mais manter a sessão entre requisições, deve-se invalidá-la void invalidate () void setMaxInactiveInterval (int seg) Outros métodos de HttpSession public String getId(): identificador da sessão public boolean isNew(): true se a sessão for recém criada public long getCreationTime(): data em que a sessão foi criada public long getLasAccessedTime(): data do último acesso public int getMaxInactiveInterval(): valor do maior intervalo sem uso para a sessão