草庐IT

第128篇:浏览器存储(cookie、webStorage、 IndexedDB)

养肥胖虎 2023-03-28 原文

好家伙,本篇为《JS高级程序设计》第二五章“浏览器存储”学习笔记

 

我们先来讲个故事

一个“薅羊毛”的故事 (qq.com)

概括一下,就是

有个人通过网络平台非法购买了大量“cookie”数据。

突破平台封控,冒用他人新用户身份,非法骗取新用户优惠券。

拿着优惠券低价购入商品,随后转卖并从中赚取差价。

再将使用过的“cookie”数据再次低价转卖或转赠他人,从中获利。(太狠了)

随后我们回到正题

 

我们进入一个需要登陆的网站,我们注册登录

随后,我们希望每次进入的时候,都不再需要手动输入信息登录,

我们希望浏览器中保存着我们的信息

于是,直接在客户端存储用户信息的需求出现了

 

常见存储方式主要有两种:cookie、webStorage(localStorage和sessionStorage)

 

1.cookie

HTTP cookie 通常也叫作 cookie,最初用于在客户端存储会话信息。

这个规范要求服务器在响应 HTTP 请求时,通过发送 Set-Cookie HTTP 头部包含会话信息。

 

 

1.1.cookie 的限制

cookie 是与特定域绑定的。设置 cookie 后,它会与请求一起发送到创建它的域。

这个限制能保证 cookie 中存储的信息只对被认可的接收者开放,不被其他域访问。

 不超过 300 个 cookie;

 每个 cookie 不超过 4096 字节;

 每个域不超过 20 个 cookie;

 每个域不超过 81 920 字节。

 

1.2.cookie的组成

cookie 的限制(来看看他长什么样子)

 

 

 名称:唯一标识 cookie 的名称。cookie 名不区分大小写

 值:存储在 cookie 里的字符串值。这个值必须经过 URL 编码。

 域:cookie 有效的域。发送到这个域的所有请求都会包含对应的 cookie。

 路径:请求 URL 中包含这个路径才会把 cookie 发送到服务器。

 过期时间:表示何时删除 cookie 的时间戳(

 安全标志:设置之后,只在使用 SSL 安全连接的情况下才会把 cookie 发送到服务器。

 

1.3.使用

所有名和值都是 URL 编码的,因此必须使用 decodeURIComponent()解码。

class CookieUtil {
    static get(name) {
        let cookieName = `${encodeURIComponent(name)}=`,
            cookieStart = document.cookie.indexOf(cookieName),
            cookieValue = null;
        if (cookieStart > -1) {
            let cookieEnd = document.cookie.indexOf(";", cookieStart);
            if (cookieEnd == -1) {
                cookieEnd = document.cookie.length;
            }
            cookieValue = decodeURIComponent(document.cookie.substring(cookieStart +
                cookieName.length, cookieEnd));
        }
        return cookieValue;
    }
    static set(name, value, expires, path, domain, secure) {
        let cookieText =
            `${encodeURIComponent(name)}=${encodeURIComponent(value)}`
        if (expires instanceof Date) {
            cookieText += `; expires=${expires.toGMTString()}`;
        }
        if (path) {
            cookieText += `; path=${path}`;
        }
        if (domain) {
            cookieText += `; domain=${domain}`;
        }
        if (secure) {
            cookieText += "; secure";
        }
        document.cookie = cookieText;
    }
    static unset(name, path, domain, secure) {
        CookieUtil.set(name, "", new Date(0), path, domain, secure);
    }
};

// 设置 cookie 
CookieUtil.set("name", "panghu"); 
// 读取 cookie 
alert(CookieUtil.get("panghu")); // "panghu" 

(然而我这并没有出现正确结果)

 

 

 

2.Web Storage

Web Storage 的目的是解决通过客户端存储不需要频繁发送回服务器的数 据时使用 cookie 的问题。

分为localStorage 和 sessionStorage

 

2.1.sessionStorage对象

sessionStorage 对象只存储会话数据,这意味着数据只会存储到浏览器关闭。

存储在 sessionStorage 中的数据不受页面刷新影响,可以在浏览器崩溃 并重启后恢复。

 

基本用法(增删查改)

// 使用方法存储数据
sessionStorage.setItem("name", "胖虎"); 
// 使用属性存储数据
sessionStorage.book = "好书"; 

// 使用方法取得数据
let name = sessionStorage.getItem("name"); 
// 使用属性取得数据
let book = sessionStorage.book; 

console.log(name+book)
// 使用 delete 删除值
delete sessionStorage.name; 
// 使用方法删除值
sessionStorage.removeItem("book"); 

console.log(sessionStorage);

 

 

 

2.2.localStorage 对象

要访问同一个 localStorage 对象,页面必须来自同一个域(子域不可以)、在相同的端 口上使用相同的协议。

localStorage和sessionStorage的Api用法差不太多

// 使用方法存储数据
localStorage.setItem("name", "余华"); 
// 使用属性存储数据
localStorage.book = "活着"; 
// 使用方法取得数据
let name = localStorage.getItem("name"); 
// 使用属性取得数据
let book = localStorage.book; 

console.log(name+book)

// 使用 delete 删除值
delete localStorage.name; 
// 使用方法删除值
localStorage.removeItem("book"); 

console.log(localStorage);

 

 

存储在 localStorage 中的数据会保留到通过 JavaScript 删除或者用户 清除浏览器缓存。

localStorage 数据不受页面刷新影响,也不会因关闭窗口、标签页或重新启动浏览 器而丢失

 

 

3.IndexedDB

嗯,这玩意就是浏览器中的数据库

IndexedDB 背后的思想是创造一套 API,方便 JavaScript 对象的 存储和获取,同时也支持查询和搜索

 前端本地存储数据库IndexedDB完整教程 - 掘金 (juejin.cn)

 

4.题目

1.说出cookie、localStorage和sessionStorage三者的不同点和相同点

 

 图片来自浅谈浏览器存储(cookie、localStorage、sessionStorage) - 喵小Q - 博客园 (cnblogs.com)

 

有关第128篇:浏览器存储(cookie、webStorage、 IndexedDB)的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  3. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  4. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  5. ruby-on-rails - Rails Cookie 问题 - 2

    我在ruby​​onrails应用程序中有以下新方法:defnewifcookies[:owner].empty?cookies[:owner]=SecureRandom.hexend@movie=Movie.new@movie.owner=cookies[:owner]end基本上,每个新用户都应该获得一个代码来识别他们(尽管只是通过cookie)。因此,当用户创建电影时,创建的cookie将存储在owner字段中。所以有两个问题:使用.empty?方法,当我从浏览器中删除cookie时,返回一个undefinedmethodempty?'对于nil:NilClass`当我确实已经在

  6. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  7. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  8. ruby - Controller 中的 request.cookies 和 cookies 有什么区别? - 2

    request.cookies和RubyonRails中的cookies对象有区别吗?我目前正在尝试将带有cookie的请求从我的node.js服务器发送到我的ROR4应用程序。似乎在ROR应用程序中,request.cookies包含我发送的cookie,但是cookies对象(现有逻辑所基于的对象)没有它。我已经搜索了文档,但找不到任何相关内容。我错过了什么吗?感谢您的帮助。 最佳答案 理想情况下,request.cookies和cookies应该相同。但是,在POST(创建操作)请求中,rails会验证XSRFtoken。如果

  9. ruby - 如何打印出 Mechanized 存储的 cookie? - 2

    我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject

  10. ruby-on-rails - 闪存消息存储在哪里? - 2

    我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf

随机推荐