Servlets Controle de sessões Profa. Karen Selbach Borges
ServletsControle de sessões
Profa. Karen Selbach Borges
Para começar ...
Sessão ≠ Seção ≠ Cessão• Sessão : sessão de cinema
• Seção (ou secção) : seção de vendas
• Cessão : cessão de direitos
Java também e cultura !
Todo Mundo Tem Dúvidas, Inclusive VocêProf. Édison de OliveiraEditora Sagra.
Sessões
• O protocolo HTTP não suporta informações permanentes que poderiam ajudar um servidor Web a determinar que uma solicitação é de um cliente particular.
• As sessões servem para identificar o usuário durante várias requisições ou visitas a um site da Web
• A sessão de um usuário persiste durante um período de tempo que normalmente é configurado no servidor
Introdução
• O Servlet API fornece 3 maneiras de controlar o estado do cliente :– Cookies – Reescrita de URL– Monitoramento de sessão
Cookies
• Mecanismo utilizado por um servlet para armazenar uma pequena quantidade de informação de estado associado a um cliente.
• Exemplos de uso :– Quando o cliente loga-se em um site, verificar
se ele já esteve neste site– Armazenar informações a respeito das
preferências do usuário
Cookies
• São pequenos arquivos enviados pela servlet como parte de uma resposta ao cliente, que ficam armazenados na máquina do cliente.
• Quando um HttpServlet recebe uma solicitação, o cabeçalho inclui as informações (ex. tipo de solicitação GET ou POST) e os cookies armazenados na máquina do cliente.
Cookies
• São automaticamente excluídos quando expiram (isto é, alcançam sua idade máxima).– método setMaxAge(int segundos)
• Segundos < 0 : cookie expira assim que o navegador fechar
• Segundos == 0 navegador apaga o cookie.
Adicionando Cookies
• O método addCookie permite o envio de um cookie ao cliente junto da resposta;
• O cookie é representado por um objeto da classe javax.servlet.http.Cookie; – O cookie deve ter um nome e um valor, para tanto
utiliza-se o construtor:– public Cookie(String name, String value);
Criando e Recuperando Cookies
• Criando e enviando um cookie:Cookie cookie = new Cookie(“id”,”100234”);
response.addCookie(cookie);
• Recuperando um cookie: Cookie cookies[] = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals("id")) {
String identifica = cookies[i].getValue(); }}}
Cookies
• Problemas– Muitas pessoas desativam cookies por
questões de privacidade
Reescrita de URL
• Reescita de URL é a solução para clientes que não suportam ou tenham sido configurados para rejeitar cookies.
• Exemplo:– http://host.path/file.html;jsessionid=1234
Reescrita de URL
• Método que associa uma ID de sessão com uma URL é o response.encodeURL(String url)
• Método que associa uma ID de sessão e redireciona para outra página é o response.encodeRedirectURL(String url)
Reescrita de URL
• Problemas:– Não suporta o armazenamento de pares
nome/valor como as cookies– As informações podem ser perdidas no caso
de uso de retornar ao site através de bookmarks, links ou se a URL for inserida manualmente.
• Funciona melhor em páginas JSP (veremos isso mais adiante)
Monitoramento de Sessão
• A maneira mais eficiente para fazer o monitoramento de sessão é através do uso da API HttpSession.
• O fornecedor do contêiner Web implementa essa interface, e a cada usuário dentro do site pode ser atribuído um objeto de sessão no servidor
Monitoramento de Sessão
• O objeto session tem dois papéis-chave:– Ele armazena informações sobre data e hora
de criação e de último acesso para uma sessão particular, junto com um ID de sessão único;
– Ele também permite que outros objetos sejam amarrados à sessão (carrinho de compras, por exemplo)
Criando Objetos de Sessão
• A forma pela qual associamos objetos de sessão a um cliente é associando um objeto HttpSession para cada objeto HttpServletRequest (pedido).– HttpSession session = request.getSession(true);– True : se o cliente já tem o objeto HttpSession de uma
solicitação anterior, então o método getSession retorna este objeto. Caso contrário cria o objeto HttpSession.
– False : se não existir um objeto HttpSession, então o servlet não deve criar um novo objeto.
Criando Objetos de Sessão
• Cada objeto HttpSession tem um id (única) que é uma String criada quando o objeto é criado.
– session. setAttribute(nome, obj);– Onde :
• Nome: identificador único do objeto da sessão• Obj : objeto da sessão.
– Os objetos persistem até o término da sessão ou até a sessão expirar de forma automática ou explícita.
Recuperando Objetos de Sessão
• O método getAttributeNames recupera o valor dos nomes dos objetos de sessão disponíveis.
HttpSession session = request.getSession(false);
if (session != null) {
Enumeration nomes = session.getAttributeNames();
while (nomes.hasMoreElements()) {
String nome = (String) nomes.nextElement();
}
}
Recuperando Objetos de Sessão
• O método getAttribute recupera o valor associado a um determinado nome
• Ou seja, recebe o nome e retorna uma referência ao Object para o valor correspondente.
Usuario valor= (Usuario) session.getAttribute("usuario"); out.println("Olá : " + value.getNome() +" !<br>");
Outros Métodos
• void removeAttribute(String nome) : remove da sessão o objeto associado ao nome.
• String getId() : retorna o valor do identificador único da sessão.
• long getCreationTime() : retorna a data e hora (milisegundos) em que o objeto foi criado.
Outros Métodos
• long getLastAccessdTime() : retorna o a data e hora (milisegundos) no qual ocorreu o último pedido enviado pelo cliente da sessão
• ServletContext getServletContext(): retorna o ServletContext atual para a sessão
• boolean isNew(): retorna true se a sessão atual não estiver sendo utilizada pelo cliente
Outros Métodos
• void setMaxInactiveInterval(int intervalo) : configura o tempo máximo em milisssegundos que o container manterá a sessão se o usuário não fizer requisições.
• int getMaxInactiveInterval() : retorna o intervalo máximo em milisssegundos que o usuário pode ficar sem fazer requisições sem que sua sessão seja invalidada.
Encerrando uma Sessão
• As sessões tem um tempo limite alocado para elas(padrão é 30 minutos).
• É possível terminar uma sessão explicitamente (em geral quando o usuário faz o logout)
• Utilizar o método invalidate().
if (session !=null) session.invalidate();