Manipulando Cookies e uma Sessão em um Servlet Java

Manipulando Cookies e uma Sessão em um Servlet Java

1. Visão geral

Neste tutorial, vamos cobrirthe handling of cookies and sessions in Java, using Servlets.

Além disso, descreveremos brevemente o que é um cookie e exploraremos alguns exemplos de casos de uso para ele.

Simplificando,a cookie is a small piece of data stored on the client-side which servers use when communicating with clients.

They’re used to identify a client ao enviar uma solicitação subsequente. Eles também podem ser usados ​​para passar alguns dados de um servlet para outro.

Para obter mais detalhes, consulteto this article.

A classeCookie é definida no pacotejavax.servlet.http.

Para enviar ao cliente, precisamoscreate one and add it to the response:

Cookie uiColorCookie = new Cookie("color", "red");
response.addCookie(uiColorCookie);

No entanto, sua API é muito mais ampla - vamos explorá-la.

Podemos definir a idade máxima (com um métodomaxAge(int)) que define por quantos segundos um determinado cookie deve ser válido:

uiColorCookie.setMaxAge(60*60);

Definimos uma idade máxima para uma hora. Após esse período, o cookie não pode mais ser usado por um cliente (navegador) ao enviar uma solicitação e também deve ser removido do cache do navegador.

Outro método útil na APICookie ésetDomain(String).

Isso nos permite especificar nomes de domínio para os quais ele deve ser entregue pelo cliente. Também depende se especificarmos o nome de domínio explicitamente ou não.

Vamos definir o domínio de um cookie:

uiColorCookie.setDomain("example.com");

O cookie será entregue a cada solicitação feita porexample.come seus subdomínios.

If we don’t specify a domain explicitly, it will be set to the domain namewhich created a cookie.

Por exemplo, se criarmos um cookie deexample.come deixarmos o nome de domínio vazio, ele será entregue awww.example.com (sem subdomínios).

Juntamente com um nome de domínio, também podemos especificar um caminho. Vamos dar uma olhada nisso a seguir.

O caminho especifica onde um cookie será entregue.

Se especificarmos um caminho explicitamente, umCookie será entregue ao URL fornecido e todos os seus subdiretórios:

uiColorCookie.setPath("/welcomeUser");

Implicitamente, ele será definido como o URL que criou um cookie e todos os seus subdiretórios.

Agora vamos nos concentrar em como podemos recuperar seus valores dentro de umServlet.

2.5. Leia os cookies no servlet

Os cookies são adicionados à solicitação pelo cliente. O cliente verifica seus parâmetros e decide se pode entregá-lo no URL atual.

Podemos obter todos os cookies chamandogetCookies() na solicitação (HttpServletRequest) passada paraServlet.

Podemos percorrer essa matriz e procurar a que precisamos, por exemplo, comparando seus nomes:

public Optional readCookie(String key) {
    return Arrays.stream(request.getCookies())
      .filter(c -> key.equals(c.getName()))
      .map(Cookie::getValue)
      .findAny();
}

Toremove a cookie from a browser, we have to add a new one to the response with the same name, but with a maxAge value set to 0:

Cookie userNameCookieRemove = new Cookie("userName", "");
userNameCookieRemove.setMaxAge(0);
response.addCookie(userNameCookieRemove);

Um exemplo de caso de uso para remover cookies é uma ação de logoff do usuário - talvez seja necessário remover alguns dados que foram armazenados para uma sessão de usuário ativo.

Agora sabemos como podemos lidar com cookies dentro de umServlet.

A seguir, vamos cobrir outro objeto importante que acessamos muitas vezes de um objetoServlet - aSession.

3. HttpSession Objeto

OHttpSession é outra opção para armazenar dados relacionados ao usuário em diferentes solicitações. Uma sessão é um armazenamento do lado do servidor que contém dados contextuais.

Os dados não são compartilhados entre diferentes objetos de sessão (o cliente pode acessar os dados apenas de sua sessão). Ele também contém pares de valores-chave, mas, em comparação com um cookie, uma sessão pode conter um objeto como um valor. O mecanismo de implementação de armazenamento depende do servidor.

Uma sessão é correspondida com um cliente por um cookie ou parâmetros de solicitação. Mais informações podem ser encontradashere.

3.1. Obtendo uma Sessão

Podemos obter umHttpSession direto de uma solicitação:

HttpSession session = request.getSession();

O código acima irá criar uma nova sessão caso ela não exista. Podemos conseguir o mesmo chamando:

request.getSession(true)

Caso desejemos apenas obter a sessão existente e não criar uma nova, precisamos usar:

request.getSession(false)

Se acessarmos a página JSP pela primeira vez, uma nova sessão será criada por padrão. Podemos desativar esse comportamento definindo o atributosession parafalse:

<%@ page contentType="text/html;charset=UTF-8" session="false" %>

Na maioria dos casos, um servidor web usa cookies para gerenciamento de sessões. Quando um objeto de sessão é criado, um servidor cria um cookie com a chave e o valorJSESSIONID que identifica uma sessão.

3.2. Atributos deSession

O objeto de sessão fornece vários métodos para acessar (criar, ler, modificar, remover) atributos criados para uma determinada sessão do usuário:

  • setAttribute(String, Object) que cria ou substitui um atributo de sessão por uma chave e um novo valor

  • getAttribute(String) que lê um valor de atributo com um determinado nome (chave)

  • removeAttribute(String) que remove um atributo com um determinado nome

Também podemos verificar facilmente os atributos de sessão já existentes chamandogetAttributeNames().

Como já mencionamos, podemos recuperar um objeto de sessão de uma solicitação. Quando já o temos, podemos executar rapidamente os métodos mencionados acima.

Podemos criar um atributo:

HttpSession session = request.getSession();
session.setAttribute("attributeKey", "Sample Value");

O valor do atributo pode ser obtido por sua chave (nome):

session.getAttribute("attributeKey");

Podemos remover um atributo quando não precisar mais dele:

session.removeAttribute("attributeKey");

Um caso de uso conhecido para uma sessão de usuário é invalidar dados inteiros armazenados quando um usuário efetua logout em nosso site. O objeto de sessão fornece uma solução para ele:

session.invalidate();

Esse método remove a sessão inteira do servidor da web, para que não possamos mais acessar atributos dela.

O objetoHttpSession possui mais métodos, mas os que mencionamos são os mais comuns.

4. Conclusão

Neste artigo, abordamos dois mecanismos que permitem armazenar dados do usuário entre solicitações subsequentes ao servidor - o cookie e a sessão.

Lembre-se de que o protocolo HTTP é sem estado e, portanto, é necessário manter o estado entre solicitações.

Como sempre, trechos de código estão disponíveisover on Github.