HTML - Armazenamento Web

-

Tipos de Armazenamento Web

Existem dois tipos de armazenamento web: Armazenamento Local e Armazenamento de Sessão. Ambos permitem armazenar pares de chave-valor no navegador, mas têm diferentes durações e escopos.

Armazenamento Local

O Armazenamento Local é um tipo de armazenamento web que permite guardar dados no navegador sem data de expiração. Os dados armazenados no Armazenamento Local permanecerão no navegador mesmo após o fechamento da janela. Isso o torna útil para armazenar dados que precisam ficar disponíveis por mais tempo.

Para armazenar dados no Armazenamento Local, você pode usar o objeto localStorage.

Exemplo: Armazenando um valor no Armazenamento Local

localStorage.setItem('username', 'JohnDoe');

Estamos armazenando um par chave-valor onde a chave é 'username' e o valor é 'JohnDoe'. Para obter os dados armazenados, você pode usar o método getItem():

Exemplo: Obtendo um valor do Armazenamento Local

const username = localStorage.getItem('username');
console.log(username); // Saída: 'JohnDoe'

Você também pode alterar o valor de um item armazenado usando setItem() novamente com a mesma chave e um novo valor:

Exemplo: Alterando um valor no Armazenamento Local

localStorage.setItem('username', 'JaneSmith');

Armazenamento de Sessão

O Armazenamento de Sessão é outro tipo de armazenamento web que permite guardar dados para uma única sessão. Os dados armazenados no Armazenamento de Sessão permanecerão no navegador apenas até que a janela ou aba seja fechada. Quando a sessão termina, os dados são apagados.

Para armazenar dados no Armazenamento de Sessão, você pode usar o objeto sessionStorage, que tem os mesmos métodos que o localStorage.

Exemplo: Armazenando um valor no Armazenamento de Sessão

sessionStorage.setItem('theme', 'dark');

Estamos armazenando um par chave-valor onde a chave é 'theme' e o valor é 'dark'. Para obter os dados armazenados, você pode usar o método getItem():

Exemplo: Obtendo um valor do Armazenamento de Sessão

const theme = sessionStorage.getItem('theme');
console.log(theme); // Saída: 'dark'

Você pode alterar os dados armazenados no Armazenamento de Sessão da mesma forma que no Armazenamento Local, usando o método setItem() com a mesma chave e um novo valor:

Exemplo: Alterando um valor no Armazenamento de Sessão

sessionStorage.setItem('theme', 'light');

Tanto o Armazenamento Local quanto o Armazenamento de Sessão têm seus próprios usos com base na duração e no escopo dos dados que você deseja armazenar. O Armazenamento Local é bom para guardar dados que precisam ficar disponíveis mesmo após o fechamento do navegador, enquanto o Armazenamento de Sessão é útil para armazenar dados específicos de uma única sessão ou página.

Trabalhando com Armazenamento Web

O Armazenamento Web oferece métodos para armazenar, obter e remover dados no navegador. Vamos ver como trabalhar com dados no Armazenamento Local e no Armazenamento de Sessão.

Armazenando Dados

Para armazenar dados no Armazenamento Web, você pode usar o método setItem(). Este método recebe dois argumentos: a chave (uma string) e o valor que você deseja armazenar.

Você pode armazenar diferentes tipos de dados no Armazenamento Web, como strings, números e objetos. Ao armazenar objetos, você precisa convertê-los para uma string usando JSON.stringify() antes de armazenar.

Exemplo: Armazenando uma string e um objeto no Armazenamento Local

// Armazenando uma string
localStorage.setItem('username', 'JohnDoe');

// Armazenando um objeto
const user = {
  name: 'John Doe',
  age: 25,
  email: 'john@example.com'
};
localStorage.setItem('user', JSON.stringify(user));

Obtendo Dados

Para obter dados do Armazenamento Web, você pode usar o método getItem(). Este método recebe um argumento: a chave dos dados que você deseja obter.

Se os dados armazenados forem uma string, você pode usá-los diretamente. No entanto, se você armazenou um objeto, você precisa analisá-lo de volta para um objeto usando JSON.parse().

Exemplo: Obtendo dados do Armazenamento Local

// Obtendo uma string
const username = localStorage.getItem('username');
console.log(username); // Saída: 'JohnDoe'

// Obtendo um objeto
const userString = localStorage.getItem('user');
const user = JSON.parse(userString);
console.log(user.name); // Saída: 'John Doe'
console.log(user.age); // Saída: 25
console.log(user.email); // Saída: 'john@example.com'

Removendo Dados

Para remover dados do Armazenamento Web, você tem duas opções:

Opção Descrição
removeItem() Remove um par chave-valor específico
clear() Remove todos os dados armazenados no Armazenamento Web

Exemplo: Removendo dados do Armazenamento Local

// Removendo um item específico
localStorage.removeItem('username');

// Removendo todos os dados
localStorage.clear();

Os mesmos métodos (setItem(), getItem(), removeItem() e clear()) podem ser usados com o Armazenamento de Sessão, substituindo localStorage por sessionStorage.

Lembre-se que os dados armazenados no Armazenamento Web são específicos para o domínio. Cada domínio tem seu próprio espaço de armazenamento separado, e o JavaScript de um domínio não pode acessar dados armazenados por outro domínio.

Eventos de Armazenamento Web

O Armazenamento Web oferece eventos que permitem reagir a mudanças nos dados armazenados. Esses eventos são acionados quando os dados são armazenados, alterados ou removidos no Armazenamento Local ou no Armazenamento de Sessão.

O evento storage é disparado sempre que ocorre uma mudança no Armazenamento Web. Esse evento é acionado no objeto window de todas as páginas da mesma origem que têm acesso à área de armazenamento. O objeto de evento passado para o ouvinte do evento contém propriedades úteis, como:

Propriedade Descrição
key A chave do item que foi alterado (adicionado, atualizado ou removido).
oldValue O valor antigo do item antes da alteração (null se um novo item foi adicionado).
newValue O novo valor do item após a alteração (null se um item foi removido).
url A URL da página que fez a alteração.
storageArea O objeto de armazenamento (localStorage ou sessionStorage) que foi afetado.

Para lidar com eventos de armazenamento, você pode usar o método addEventListener() no objeto window.

Exemplo: Lidando com Eventos de Armazenamento

window.addEventListener('storage', function(event) {
  console.log('Evento de armazenamento acionado');
  console.log('Chave:', event.key);
  console.log('Valor antigo:', event.oldValue);
  console.log('Novo valor:', event.newValue);
  console.log('URL:', event.url);
  console.log('Área de armazenamento:', event.storageArea);
});

É importante notar que o evento storage não é acionado na mesma página que fez a alteração. Ele é acionado apenas em outras páginas da mesma origem que têm acesso à área de armazenamento. Isso permite a comunicação entre diferentes páginas ou abas do seu aplicativo.

Exemplo: Sincronizando Dados Entre Páginas

// Página 1
localStorage.setItem('tema', 'escuro');

// Página 2
window.addEventListener('storage', function(event) {
  if (event.key === 'tema') {
    document.body.className = event.newValue;
  }
});

A Página 1 define o valor da chave 'tema' no Armazenamento Local. A Página 2 escuta eventos de armazenamento e verifica se a chave alterada é 'tema'. Se for, ela atualiza o nome da classe do elemento <body> para o novo valor, aplicando a mudança de tema.

Os eventos de armazenamento oferecem uma maneira de reagir a mudanças no Armazenamento Web e permitem a comunicação e sincronização entre diferentes páginas ou abas do seu aplicativo. Eles podem ser usados para vários fins, como sincronizar preferências do usuário, atualizar dados exibidos em tempo real ou acionar certas ações com base em mudanças nos dados armazenados.

Segurança do Armazenamento Web

Ao usar o Armazenamento Web (Armazenamento Local e Armazenamento de Sessão) para guardar dados no navegador, você deve considerar a segurança para proteger sua aplicação e os dados do usuário contra acesso não autorizado ou ataques.

Um dos principais riscos de segurança associados ao Armazenamento Web são os ataques de script entre sites (XSS). Ataques XSS ocorrem quando scripts maliciosos são injetados em sua aplicação e executados no contexto da sua página. Se você armazenar dados sensíveis no Armazenamento Web sem medidas de segurança adequadas, um atacante poderia acessar e roubar esses dados.

Para prevenir ataques XSS, você deve sempre validar e higienizar qualquer entrada do usuário antes de armazená-la no Armazenamento Web. Isso significa verificar a entrada em busca de caracteres ou scripts maliciosos e removê-los ou codificá-los. Você pode usar bibliotecas ou frameworks que fornecem funções integradas de validação e higienização de entrada para ajudar nesse processo.

Exemplo: Higienizar Entrada do Usuário

function sanitizeInput(input) {
  // Remove quaisquer tags HTML e caracteres especiais
  return input.replace(/<[^>]*>?/gm, '').replace(/[^\w\s]/gi, '');
}

const userInput = '<script>alert("Ataque XSS!");</script>';
const sanitizedInput = sanitizeInput(userInput);
localStorage.setItem('userInput', sanitizedInput);

Outra consideração de segurança é criptografar dados sensíveis antes de armazená-los no Armazenamento Web. Embora os dados do Armazenamento Web não sejam diretamente acessíveis por outros sites, eles ainda podem ser lidos por qualquer pessoa que tenha acesso ao dispositivo ou navegador do usuário. Criptografar os dados adiciona uma camada extra de proteção.

Para criptografar dados, você pode usar algoritmos de criptografia como AES (Advanced Encryption Standard) ou bibliotecas que fornecem funções de criptografia. Antes de armazenar dados sensíveis, criptografe-os com uma chave de criptografia segura. Ao recuperar os dados, descriptografe-os usando a mesma chave.

Exemplo: Criptografar e Descriptografar Dados

function encryptData(data, key) {
  // Implementar lógica de criptografia usando uma biblioteca ou algoritmo
  // Exemplo usando uma cifra de substituição simples
  const encryptedData = data.split('').map(char => String.fromCharCode(char.charCodeAt(0) + key)).join('');
  return encryptedData;
}

function decryptData(encryptedData, key) {
  // Implementar lógica de descriptografia usando uma biblioteca ou algoritmo
  // Exemplo usando uma cifra de substituição simples
  const decryptedData = encryptedData.split('').map(char => String.fromCharCode(char.charCodeAt(0) - key)).join('');
  return decryptedData;
}

const sensitiveData = 'Dados Secretos';
const encryptionKey = 3;
const encryptedData = encryptData(sensitiveData, encryptionKey);
localStorage.setItem('sensitiveData', encryptedData);

// Recuperando e descriptografando os dados
const storedEncryptedData = localStorage.getItem('sensitiveData');
const decryptedData = decryptData(storedEncryptedData, encryptionKey);
console.log(decryptedData); // Saída: 'Dados Secretos'

É importante escolher uma chave de criptografia segura e mantê-la protegida. Evite armazenar a chave de criptografia no mesmo local que os dados criptografados, pois isso anularia o propósito da criptografia.

Além disso, tenha cuidado com os dados que você armazena no Armazenamento Web. Evite armazenar informações altamente sensíveis como senhas, números de cartão de crédito ou números de identificação pessoal (PINs) no Armazenamento Web, mesmo que criptografados. Geralmente, é mais seguro armazenar dados sensíveis no lado do servidor e usar protocolos de comunicação seguros como HTTPS para transmitir os dados.

Suporte e Limitações do Navegador

O Web Storage (Local Storage e Session Storage) é compatível com navegadores modernos. No entanto, é importante conhecer a compatibilidade entre navegadores e os limites de armazenamento ao usar o Web Storage em suas aplicações web.

A maioria dos navegadores modernos, incluindo Chrome, Firefox, Safari, Edge e Internet Explorer (versão 8 e superior), suporta o Web Storage. Eles permitem armazenar e obter dados usando os objetos localStorage e sessionStorage sem grandes problemas.

No entanto, algumas versões mais antigas de navegadores ou navegadores menos comuns podem ter suporte limitado ou nenhum suporte ao Web Storage. É recomendável verificar a compatibilidade dos recursos do Web Storage que você planeja usar. Você pode consultar recursos online como Can I Use para ver a matriz de suporte dos navegadores para o Web Storage.

Ao usar o Web Storage, você também deve conhecer os limites e cotas de armazenamento. Cada navegador tem seus próprios limites de armazenamento para o Web Storage. O limite exato pode variar de acordo com o navegador e o dispositivo.

Navegador Limite Aproximado de Armazenamento
Chrome 5MB por origem
Firefox 5MB por origem
Safari 5MB por origem
Internet Explorer 10MB por origem

Esses limites são por origem, o que significa que cada domínio (ou subdomínio) tem seu próprio limite de armazenamento separado. Se sua aplicação precisa armazenar muitos dados, você deve verificar o espaço de armazenamento disponível e lidar cuidadosamente com as exceções de limite de armazenamento.

Para verificar o espaço de armazenamento disponível, você pode usar a API StorageManager em navegadores modernos. Ela fornece métodos como estimate() para obter uma estimativa do espaço de armazenamento disponível.

Exemplo: Verificando o Espaço de Armazenamento Disponível

if (navigator.storage && navigator.storage.estimate) {
  navigator.storage.estimate().then(({ usage, quota }) => {
    console.log(`Usando ${usage} de ${quota} bytes.`);
  });
} else {
  console.log('API StorageManager não suportada.');
}

Se você tentar armazenar dados que excedam a cota de armazenamento disponível, um erro QuotaExceededError será lançado. Você deve capturar e lidar com esse erro para fornecer uma alternativa ou notificar o usuário.

Exemplo: Lidando com Exceções de Limite de Armazenamento

try {
  localStorage.setItem('chave', 'valor');
} catch (e) {
  if (e.name === 'QuotaExceededError') {
    console.log('Limite de armazenamento excedido. Não é possível armazenar mais dados.');
    // Lidar com o erro, por exemplo, removendo dados não utilizados ou notificando o usuário
  } else {
    console.log('Ocorreu um erro ao armazenar dados:', e);
  }
}

Ao lidar com limites de armazenamento, você pode considerar usar estratégias como compressão de dados, armazenamento seletivo de dados ou uso de armazenamento do lado do servidor para conjuntos de dados maiores. Também é bom limpar regularmente dados desnecessários do Web Storage para liberar espaço.

Lembre-se de que o Web Storage é específico para cada navegador. Os dados armazenados em um navegador não estarão disponíveis em outro navegador ou em um dispositivo diferente. Se você precisar armazenar dados que devem estar disponíveis em diferentes navegadores ou dispositivos, talvez seja necessário considerar outras opções de armazenamento, como armazenamento do lado do servidor ou soluções de armazenamento em nuvem.

Exemplos Práticos e Casos de Uso

O Armazenamento Web (Armazenamento Local e Armazenamento de Sessão) tem muitos usos no desenvolvimento web. Aqui estão alguns exemplos comuns e casos de uso onde o Armazenamento Web pode melhorar a experiência do usuário e a funcionalidade do aplicativo.

Armazenando Preferências e Configurações do Usuário

O Armazenamento Web é uma maneira de armazenar preferências e configurações do usuário. Você pode usar o Armazenamento Local para salvar coisas como o idioma preferido do usuário, tema ou escolhas de layout. Isso permite manter as preferências do usuário mesmo após eles saírem do site e voltarem mais tarde.

Exemplo: Armazenando Preferências e Configurações do Usuário

// Define a preferência de tema do usuário
function setTheme(theme) {
  localStorage.setItem('theme', theme);
  applyTheme(theme);
}

// Aplica o tema selecionado
function applyTheme(theme) {
  document.body.className = theme;
}

// Obtém a preferência de tema do usuário ao carregar a página
window.addEventListener('load', function() {
  const storedTheme = localStorage.getItem('theme');
  if (storedTheme) {
    applyTheme(storedTheme);
  }
});

A função setTheme() armazena o tema selecionado pelo usuário no Armazenamento Local. A função applyTheme() aplica o tema à página definindo o nome da classe do elemento <body>. Ao carregar a página, verificamos se há uma preferência de tema armazenada e a aplicamos, se encontrada.

Armazenando Dados em Cache para Acesso Offline

O Armazenamento Web pode armazenar dados em cache para acesso offline. Se seu aplicativo web precisa funcionar offline ou em situações de baixa conectividade, você pode armazenar dados no Armazenamento Local. Isso permite que o aplicativo funcione mesmo quando o usuário não está conectado à internet.

Exemplo: Armazenando Dados em Cache para Acesso Offline

// Armazena os dados em cache no Armazenamento Local
function cacheData(data) {
  localStorage.setItem('cachedData', JSON.stringify(data));
}

// Recupera os dados em cache do Armazenamento Local
function getCachedData() {
  const cachedData = localStorage.getItem('cachedData');
  return cachedData ? JSON.parse(cachedData) : null;
}

// Busca dados do servidor
function fetchDataFromServer() {
  // Faz uma requisição à API para buscar dados
  fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => {
      // Armazena os dados buscados em cache
      cacheData(data);
      // Usa os dados no aplicativo
      displayData(data);
    })
    .catch(error => {
      console.log('Erro ao buscar dados:', error);
      // Recupera dados em cache como alternativa
      const cachedData = getCachedData();
      if (cachedData) {
        displayData(cachedData);
      } else {
        console.log('Nenhum dado em cache disponível.');
      }
    });
}

A função cacheData() armazena os dados buscados no Armazenamento Local. A função getCachedData() recupera os dados em cache do Armazenamento Local. Se o aplicativo falhar ao buscar dados do servidor (por exemplo, devido a um erro de rede), ele recorre aos dados em cache, se disponíveis.

Implementando Funcionalidade de Carrinho de Compras

O Armazenamento Web pode implementar funcionalidade de carrinho de compras em aplicativos de comércio eletrônico. Você pode usar o Armazenamento de Sessão para armazenar os produtos e quantidades selecionados pelo usuário enquanto eles navegam pelo site. Isso permite que o carrinho de compras permaneça intacto mesmo se o usuário navegar para longe da página ou fechar a aba do navegador.

Exemplo: Implementando Funcionalidade de Carrinho de Compras

// Adiciona um produto ao carrinho de compras
function addToCart(product) {
  let cart = JSON.parse(sessionStorage.getItem('cart')) || [];
  cart.push(product);
  sessionStorage.setItem('cart', JSON.stringify(cart));
}

// Remove um produto do carrinho de compras
function removeFromCart(productId) {
  let cart = JSON.parse(sessionStorage.getItem('cart')) || [];
  cart = cart.filter(product => product.id !== productId);
  sessionStorage.setItem('cart', JSON.stringify(cart));
}

// Obtém o conteúdo atual do carrinho de compras
function getCartContents() {
  return JSON.parse(sessionStorage.getItem('cart')) || [];
}

A função addToCart() adiciona um produto ao carrinho de compras armazenado no Armazenamento de Sessão. A função removeFromCart() remove um produto do carrinho com base em seu ID. A função getCartContents() recupera o conteúdo atual do carrinho de compras.

Salvando Dados de Formulário Temporariamente

O Armazenamento Web pode salvar dados de formulário temporariamente. Se um usuário está preenchendo um formulário longo e acidentalmente fecha o navegador ou navega para longe da página, você pode usar o Armazenamento de Sessão para salvar o progresso deles. Quando eles retornarem ao formulário, você pode restaurar os dados salvos, permitindo que eles continuem de onde pararam.

Exemplo: Salvando Dados de Formulário Temporariamente

// Salva dados do formulário no Armazenamento de Sessão
function saveFormData() {
  const form = document.querySelector('form');
  const formData = new FormData(form);
  sessionStorage.setItem('formData', JSON.stringify(Object.fromEntries(formData)));
}

// Carrega dados do formulário do Armazenamento de Sessão
function loadFormData() {
  const savedData = sessionStorage.getItem('formData');
  if (savedData) {
    const formData = JSON.parse(savedData);
    const form = document.querySelector('form');
    Object.keys(formData).forEach(key => {
      const field = form.elements[key];
      if (field) {
        field.value = formData[key];
      }
    });
  }
}

// Salva dados do formulário na mudança de entrada
document.querySelector('form').addEventListener('input', saveFormData);

// Carrega dados do formulário ao carregar a página
window.addEventListener('load', loadFormData);

A função saveFormData() salva os dados do formulário no Armazenamento de Sessão sempre que um campo de entrada muda. A função loadFormData() carrega os dados do formulário salvos do Armazenamento de Sessão quando a página é carregada, preenchendo os campos do formulário com os valores inseridos anteriormente.

Estes são alguns exemplos de como o Armazenamento Web pode ser usado em cenários práticos. O Armazenamento Web fornece uma maneira simples de armazenar dados no lado do cliente, permitindo várias funcionalidades e melhorias em aplicativos web. Ele oferece uma solução para melhorar a experiência do usuário e a funcionalidade de seus aplicativos web.