H5学习之路之Web存储解决方案

简介: H5学习之路之Web存储解决方案

我们所说的H5的存储方案指的是客户端的数据存储,这点需要明白,那么在这个之前有么有可用的存储方案呢?当然是有的,之前一直用的CooKie,如果有人看过我之前写的关于客户端存储的文章, 这里就很好理解了,我之前说过cookie的弊端和优势。那么今天我们说的是H5才提出的存储方案:localStorage和sessionStorage

首先说一下为什么需要这个东西,为什么之前已经有了cookie但是H5的时候却在客户端存储这块重新定义了这两部分呢?我们都知道,客户端和服务器之间的交互一般是请求发送过去,然后服务器端将数据传递回来,这是常规的一种处理办法,但是其实我们知道,很多的时候,客户端发送的请求很多是重复的,或者是请求的数据量不大,这个时候我们选择将数据暂存在cookie这里,登录的时候的常规做法,那么cookie的存储只有4K,导致的是用户只能请求小的数据的时候才可以,那么既然在不影响性能的情况下,怎么可以尽可能的将更多的数据存放在客户端称为了一种思路和潮流,这样的做法结果是用户体验会更好,因为毕竟速度会快很多,这是一点,另外,服务器的压力会变的很小。说了那么多的废话,只是为了说明今天文章的重要性。

我们先说一下怎么用:

首先是基于js实现的,那么我们的代码肯定是写在js里面的。

我在之前也具体的写过例子:localstore例子,今天简单的再写一下,用官方的例子就行:

<!DOCTYPE html>
<html>
<body>
<div id="result"></div>
<script>
// Check browser support
if (typeof(Storage) !== "undefined") {
    // Store
    localStorage.setItem("lastname", "Gates");
    // Retrieve
    document.getElementById("result").innerHTML = localStorage.getItem("lastname");
} else {
    document.getElementById("result").innerHTML = "抱歉!您的浏览器不支持 Web Storage ...";
}
</script>
</body>
</html>

这里出现了两个基本的用法,也是我们最常用的

localStorage.setItem("key","value")      //前面是key也就是您自己起的名字,后面的是需要的数据
localStorage.getItem("key")              //需要的时候输入key就可以拿到对应的数据

这里需要说一下他的特性:

没有时间限制和刷新次数的限制,但是有浏览器的限制(也就是说他也是遵循同源策略的)

这里我们举个例子说明一下:

<!DOCTYPE HTML>
<html>
  <meta charset="UTF-8"/>
<body>
<script type="text/javascript">
  if (localStorage.pagecount)
    {
    localStorage.pagecount=Number(localStorage.pagecount) +1;
    }
  else
    {
    localStorage.pagecount=1;
    }
  document.write("Visits: " + localStorage.pagecount + " time(s).");
  </script> 
  <p>刷新页面会看到计数器在增长。</p>
  <p>请关闭浏览器窗口,然后再试一次,计数器会继续计数。</p>
</body>
</html>

(源码摘自W3cshool)

我们不换浏览器我不停刷新效果是这样的:

我关闭浏览器重新打开还是继续计数的,那么说明浏览器只要不变就是没有问题的。

当我们换一个浏览器的时候效果是这样的:

很明显只要换浏览器就重置了,那么这里其实我们也可以猜测它的原理了,其实还是基于cookie实现的,根据浏览器的缓存实现的客户端存储的效果。

ok,到这里基本上正常使用这个是没有问题了,那么有的人说了,这个做登录是没有问题,用户刷新页面也是对的,但是按照这个说法,用户就是注销了,退出了,是不是重新进入还是会有自己的信息,那岂不是很不安全,也不是常规的做法啊,对的,所以我们下面说一下,怎么清除本地的数据,有的人注销了,信息可想而知肯定是应该消失的,怎么清除呢?

localStorage.clear;

清除页面的所有内容:

var storage=window.localStorage;
            storage.a=1;
            storage.setItem("c",3);
            console.log(storage);
            storage.clear();
            console.log(storage);   //源码摘自谢灿勇的博客园

支持的版本是:

(图片摘自谢灿勇的博客园)

判断浏览器是不是支持localstorage:

if(!window.localStorage){
            alert("浏览器支持localstorage");
            return false;
        }else{
            //主逻辑业务 
        }                 //源码摘自谢灿勇的博客园

localStorage写入的三种写法:

if(!window.localStorage){
            alert("浏览器支持localstorage");
            return false;
        }else{
            var storage=window.localStorage;
            //写入a字段
            storage["a"]=1;
            //写入b字段
            storage.a=1;
            //写入c字段
            storage.setItem("c",3);
            console.log(typeof storage["a"]);
            console.log(typeof storage["b"]);
            console.log(typeof storage["c"]);
        }

读取的写法:

if(!window.localStorage){
            alert("浏览器支持localstorage");
        }else{
            var storage=window.localStorage;
            //写入a字段
            storage["a"]=1;
            //写入b字段
            storage.a=1;
            //写入c字段
            storage.setItem("c",3);
            console.log(typeof storage["a"]);
            console.log(typeof storage["b"]);
            console.log(typeof storage["c"]);
            //第一种方法读取
            var a=storage.a;
            console.log(a);
            //第二种方法读取
            var b=storage["b"];
            console.log(b);
            //第三种方法读取
            var c=storage.getItem("c");
            console.log(c);
        }

删除某个键值数据:

var storage=window.localStorage;
            storage.a=1;
            storage.setItem("c",3);
            console.log(storage);
            storage.removeItem("a");
            console.log(storage.a);

最后是如果我们将json数据存放到localstorage里面的时候,我们知道,localstorage会将数据自动转化为String类型,我们需要做的是JSON.stringify()将json数据转为jsonString类型

if(!window.localStorage){
            alert("浏览器支持localstorage");
        }else{
            var storage=window.localStorage;
            var data={
                name:'xiecanyong',
                sex:'man',
                hobby:'program'
            };
            var d=JSON.stringify(data);
            storage.setItem("data",d);
            console.log(storage.data);
        }

例子二:

var obj = { name:'Jim' };
var str = JSON.stringify(obj);
//存入
sessionStorage.obj = str;
//读取
str = sessionStorage.obj;
//重新转换为对象
obj = JSON.parse(str);

之后再将数据jsonString转为json对象

var storage=window.localStorage;
            var data={
                name:'xiecanyong',
                sex:'man',
                hobby:'program'
            };
            var d=JSON.stringify(data);
            storage.setItem("data",d);
            //将JSON字符串转换成为JSON对象输出
            var json=storage.getItem("data");
            var jsonObj=JSON.parse(json);
            console.log(typeof jsonObj);

最后我们简单的说一下他的局限性,毕竟一个东西出来了,肯定不是说只有优势没有劣势的,它的劣势是以下几个方面:

1、IE8以下的版本不支持

2、目前基本上存在的浏览器都是将存储的数据作为String类型,所以上面我也说了,如果是json的话,就需要转化一下了。

3、浏览器的隐私模式下是不可使用的

4、它的存储空间是变得很大,大概5M左右,那么如果什么我们都存在页面上的话,其实我们是不推荐这样使用的,这样导致的结果是页面变得很卡。

总结写法:

localStorage是Storage类型的实例。有以下的几种方法:
①clear():删除所有值。
②getItem(name):根据指定的名字name获取对应的值
③key(index):在指定的数字位置获取该位置的名字。
④removeItem(name):删除由name指定的名值对
⑤setItem(name,value):为指定名字设置一个对应的值

下面我们介绍sessionstorage

用法是一样,区别在于他是只要关闭浏览器就是清除数据。

总结特点:

1) 同源策略限制。若想在不同页面之间对同一个sessionStorage进行操作,这些页面必须在同一协议、同一主机名和同一端口下。(IE 8和9存储数据仅基于同一主机名,忽略协议(HTTP和HTTPS)和端口号的要求)
2) 单标签页限制。sessionStorage操作限制在单个标签页中,在此标签页进行同源页面访问都可以共享sessionStorage数据。
3) 只在本地存储。seesionStorage的数据不会跟随HTTP请求一起发送到服务器,只会在本地生效,并在关闭标签页后清除数据。(若使用Chrome的恢复标签页功能,seesionStorage的数据也会恢复)。
4) 存储方式。seesionStorage的存储方式采用key、value的方式。value的值必须为字符串类型(传入非字符串,也会在存储时转换为字符串。true值会转换为"true")。
5) 存储上限限制:不同的浏览器存储的上限也不一样,但大多数浏览器把上限限制在5MB以下。

别的就不说了,再举例子也是一样。有什么不明白的,可以下面留言,看到的都会回复的。小生能力有限,不保证写的都是对的,但是我写上去的都是查阅很多的资料以后,理解到一定程度了才会写,所以参考价值还是有的,希望可以一起交流。

相关文章
|
28天前
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
33 4
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
158 3
|
29天前
|
SQL 安全 前端开发
Web学习_SQL注入_联合查询注入
联合查询注入是一种强大的SQL注入攻击方式,攻击者可以通过 `UNION`语句合并多个查询的结果,从而获取敏感信息。防御SQL注入需要多层次的措施,包括使用预处理语句和参数化查询、输入验证和过滤、最小权限原则、隐藏错误信息以及使用Web应用防火墙。通过这些措施,可以有效地提高Web应用程序的安全性,防止SQL注入攻击。
52 2
|
2月前
|
存储 缓存 前端开发
Web应用中的存储方式有哪些?
本文首发于微信公众号“前端徐徐”,介绍了几种常见的前端数据存储技术:Cookie、Web Storage(包括 localStorage 和 sessionStorage)、IndexedDB、Cache Storage 和 Memory Storage。每种技术的特点和使用场景不同,适用于不同的开发需求。文章详细解释了它们的使用方法、特点和应用场景,并提供了代码示例。
198 2
Web应用中的存储方式有哪些?
|
2月前
|
机器学习/深度学习 移动开发 JavaScript
Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示
Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示
373 0
|
2月前
|
移动开发 前端开发 小程序
浅谈-web屏幕适配的解决方案
浅谈-web屏幕适配的解决方案
56 0
浅谈-web屏幕适配的解决方案
|
2月前
|
网络协议 API 网络安全
Web实时通信的学习之旅:轮询、WebSocket、SSE的区别以及优缺点
Web实时通信的学习之旅:轮询、WebSocket、SSE的区别以及优缺点
219 0
|
2月前
|
网络协议 安全 JavaScript
Web实时通信的学习之旅:WebSocket入门指南及示例演示
Web实时通信的学习之旅:WebSocket入门指南及示例演示
215 0
|
2月前
|
存储 前端开发 API
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
115 0
|
2月前
|
JavaScript 前端开发 安全
轻松上手Web Worker:多线程解决方案的使用方法与实战指南
轻松上手Web Worker:多线程解决方案的使用方法与实战指南
53 0