sessionStorage、localStorage 和 cookie

100 阅读4分钟

sessionStoragelocalStoragecookie 都是前端用于存储数据的方式,不过它们在特性和使用场景上有所不同,下面为你详细介绍:

区别

1. 数据生命周期

  • sessionStorage:数据仅在当前会话期间有效。当页面关闭或者浏览器窗口关闭时,存储的数据会被清除。
  • localStorage:数据会一直存储在浏览器中,除非手动清除(如通过代码调用 localStorage.removeItem() 或在浏览器设置中清除缓存),否则不会过期。
  • cookie:可以设置过期时间。如果不设置,那么它是会话级别的 cookie,在浏览器关闭时会被清除;若设置了过期时间,那么在过期时间之前数据都会保留。

2. 数据存储大小

  • sessionStoragelocalStorage:一般浏览器对它们的存储限制在 5MB 左右(不同浏览器可能有差异)。
  • cookie:单个 cookie 的大小限制通常在 4KB 左右,并且一个域名下的 cookie 数量也有限制。

3. 数据传输

  • sessionStoragelocalStorage:数据仅存储在浏览器端,不会随 HTTP 请求发送到服务器。
  • cookie:每次 HTTP 请求时,cookie 都会被发送到服务器,这会增加请求的数据量,影响性能。

4. 访问权限

  • sessionStorage:数据仅在同一浏览器窗口(或标签页)下的同源页面间共享,不同窗口(或标签页)即使同源也无法共享。
  • localStorage:数据在同源的所有窗口(或标签页)间共享。
  • cookie:只要是同源的页面,都可以访问和修改 cookie,并且服务器也可以通过响应头来设置和修改 cookie

使用场景

sessionStorage

  • 适合临时保存同一窗口(或标签页)的数据,在关闭窗口后数据不需要保留的场景。例如,在一个单页应用中,记录用户在当前会话中的操作步骤,当用户关闭页面后,这些数据就不再需要了。
// 存储数据
sessionStorage.setItem('step', '2');
// 获取数据
const currentStep = sessionStorage.getItem('step');

localStorage

  • 适用于长期保存数据,并且需要在不同页面间共享的场景。比如,记住用户的登录状态、用户的个性化设置等。
// 存储数据
localStorage.setItem('isLoggedIn', 'true');
// 获取数据
const isLoggedIn = localStorage.getItem('isLoggedIn');

cookie

  • 用于在客户端和服务器之间传递数据。例如,实现用户的身份验证,服务器可以通过 cookie 来识别用户;或者用于跟踪用户的浏览行为等。
// 设置 cookie
document.cookie = "username=John Doe; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";
// 获取 cookie
function getCookie(name) {
    const value = `; ${document.cookie}`;
    const parts = value.split(`; ${name}=`);
    if (parts.length === 2) return parts.pop().split(';').shift();
}
const username = getCookie('username');

综上所述,根据不同的需求,你可以选择合适的存储方式来存储数据。

在同一个域名下的不同标签页会共享 sessionStorage。不过,这里的“共享”有其特定规则,下面为你详细解释:

sessionStorage 的特性

sessionStorage 对象用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页后数据会被清除。这里的“窗口或标签页”指的是浏览器中的一个独立浏览上下文,并且遵循同源策略,即协议、域名和端口都相同。

不同标签页间的共享情况

  • 不同标签页间不直接共享:尽管是同一个域名,但每个标签页都有自己独立的 sessionStorage 实例。在一个标签页中对 sessionStorage 进行的修改,不会立即反映到其他标签页。
  • 通过事件监听实现同步:不过,当一个标签页对 sessionStorage 进行修改时,其他同源的标签页可以通过 storage 事件监听到这些变化。示例代码如下:
// 在其他同源标签页中监听 storage 事件
window.addEventListener('storage', function(event) {
    if (event.storageArea === sessionStorage) {
        console.log('sessionStorage 发生了变化:', event.key, event.newValue);
    }
});

代码示例

下面是一个简单的示例,展示如何在一个标签页中设置 sessionStorage,并在另一个标签页中监听这些变化:

标签页 A:设置 sessionStorage

// 设置 sessionStorage 中的值
sessionStorage.setItem('key', 'value');

标签页 B:监听 sessionStorage 变化

// 监听 storage 事件
window.addEventListener('storage', function(event) {
    if (event.storageArea === sessionStorage) {
        console.log('sessionStorage 发生了变化:', event.key, event.newValue);
    }
});

总结

同一个域名下的不同标签页有各自独立的 sessionStorage 实例,但可以通过 storage 事件在标签页间同步 sessionStorage 的变化。