数据存储之HTTP Cookie
Cookie (HTTP Cookie)
作用
HTTP本身是无状态的,客户端通过Cookie来存储会话信息
限制
cookie在性质上是绑定在特定域名下的
意思是说当设定了一个cookie之后,再给创建这个cookie的域名发送请求的时候,都会包含这个cookie,这个限制确保了存储在cookie中的信息只能让批准的接受者访问,而无法被其他域访问
每个域名的cookie总数有限制 (name=value&age=18) 两个
IE7之后 最多50个
Firefox 最多50个
Opera 最多30个
Safari和 chrome 对每个域名的cookie数量没有限制
cookie的尺寸有限制 大约4096B(加减1)的长度限制 建议cookie的长度限制在4095B以内 尺寸限制影响到一个域下的所有cookie,而非每个cookie单独限制
组成
名称
一个唯一确定cookie的名称 不区分大小写 mycookie 和 myCookie是一个cookie 实践中最好区分大小写 名称要被URL编码
值
存储cookie的字符串值 要被URL编码
域
cookie对于哪个域名是有效的 所有向该域发送的请求中都会包含这个cookie的信息
值
可以包含子域(subdomain 如www.wrox.com)
不包含子域 (如 .wrox.com 对于所有的子域都有限 可以做跨域信息存储)
默认 来自设置cookie的那个域
路径
对于指定域中的路径应该向服务器发送cookie 例:可以指定cookie只可以从http://www.wrox.com/book/中访问,那么http://www.wrox.com的页面就不会发送cookie信息
即便请求来自同一个域
失效时间
表示cookie何时应该被删除的时间戳(也就是何时应该停止向服务器发送这个cookie)
默认情况下 浏览器会话结束时即将所有的cookie删除
时间格式 GMT (toGMTString())
如果设置的失效时间是当前时间以前 则cookie会被立刻删除
安全标识
在字符串中指定 secure 即可
指定后,只有使用SSL连接的时候才发送到服务器。例如cookie信息只能发送https://www.wrox.com 而 http://www.wrox.com的请求不能发送cookie
注意:
cookie的名称 和 值 要经过 URL编码
域 路径 实效时间 secure标志都是服务器给浏览器的指示,以指定何时发送cookie 这些参数并不会发送到服务器的cookie信息的一部分,只有名值对才发送
例子
注:这里说的set-Cookie是客户端设置的内容
set-Cookie: name=value;domain=.wrox.com; path=/; secure
这里创建了一个对于所有的wrox.com的子域和域名下(由path参数指定的)所有页面都有效的cookie 因为创建了 secure标志 这个cookie只能通过SSL连接才能传输
JS中的cookie
document.cookie
返回当前页面可用的所有cookie(根据cookie的域 路径 失效时间 和安全设置)
document.cookie = "key=value" 不会覆盖之前的cookie 而是添加到cookie的字符串中 如果key相同 则覆盖
设置
name=value; expires=expiration_time; path=domian_path; secure
只有name和value是必要参数 其余为可选
例子
document.cookie = encodeURIComponent("name") + "=" + encodeURIComponent("value") +"; domain=".wrox.com; path=/; expires=" + new Date(); //new Date(0)设置为过期
IE 用户数据
<div style="behavior:url(#default#userData)" id="dataStore"></div>
var dataStore = document.getElementById("dataStore");
dataStore.setAttribute("name", "lxk");
dataStore.setAttribute("age", 22);
dataStore.save("info")
div元素上存了两部分信息 在setAttribute()存储之后 调用了save方法 指定了数据空间的名称为info 下一次页面载入的时候 使用load()方法指定同样的数据空间来获取数据 值不存在或者载入不存在的 返回为null
dataStore.load("info");
dataStore.getAttribute("name") --> lxk;
dataStore.getAttribute("age") --> 22
可以调用removeAttribute("name")来删除 之后再调用save()方法保存即可
延伸:
不同子域之间通信问题
可以通过设置 domain为.wrox.com 来让所有的子域可以拿到这个cookie
HTTP 是一个网络协议 专门用来传输WEB的内容的
SSL
Secure Sockets Layer 安全套接层 网景提出
为啥有SSL协议呢
因为HTTP协议是明文的,存在很多缺点(传输内容会被窥探和修改)
TLS
Transport Layer Security 传输层安全协议
1999年,SSL 因为应用广泛,已经成为互联网上的事实标准。IETF 就在那年把 SSL 标准化 之后标准化的名字叫TLS 和SSL为同一个东西的不同阶段
HTTPS
HTTP + SSL/TLS
var CookieUtil = {
/*
* 思路
* 字符串的截取(开始位置, 结束位置)
* 开始位置 indexOf() + name.length
* 结束位置 indexOf(";", 开始位置) 如果= -1 结束位置等于字符串的长度;
**/
get: function(name){
var cookieName = encodeURIComponent(name) + "=",
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null;
if(cookieStart > -1){
var cookieEnd = document.cookie.indexOf(";", cookieStart);
if( cookieEnd == -1){
cookieEnd = document.cookie.length;
}
cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd))
}
return cookieValue;
},
set: function(name, value, expires, path, domain, secure){
var 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;
},
unset: function(name, path, domain, secure){
this.set(name, "", new Date(0), path, domain, secure);
}
};
/*
* 解析 cookie格式(subCookie)为 name=name1=value1&name2=value2&name3=value
*
*
**/
var SubCookieUtil = {
get: function(name, subName){
var subCookie = this.getAll(name);
if(subCookie){
return subCookie[subName];
}else{
return null;
}
},
getAll: function(name){
var cookieName = encodeURIComponent(name) + "=",
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null,
cookieEnd,
subCookies,
i,
parts,
result = {};
if(cookieStart > -1){
cookieEnd = document.cookie.indexOf(";", cookieStart);
if(cookieEnd == -1){
cookieEnd = document.cookie.length;
}
cookieValue = document.cookie.substring(cookieStart + cookieName.length, cookieEnd);
if(cookieValue.length > 0){
subCookies = cookieValue.split("&");
for(i = 0, len = subCookies.length; i < len; i++){
parts = subCookies[i].split("=");
result[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1])
}
return result;
}
}
return null;
},
set: function(name, subName, value, expires, path, domain, secure){
var subcookies = this.getAll(name) || {};
subcookies[subName] = value;
this.setAll(name, subcookies, expires, path, domain, secure)
},
/*
* setALl("data", {name:"Nicholas", age: 22}, new Date("January 2 2020"))
*.
**/
setAll: function(name, subcookies, expires, path, domain, secure){
var cookieText = encodeURIComponent(name) + "=",
subCookieParts = new Array(),
subName;
for(subName in subcookies){
if(subName.length > 0 && subcookies.hasOwnProperty(subName)){
subCookieParts.push(encodeURIComponent(subName) + "=" + encodeURIComponent(subcookies[subName]))
}
}
if(subCookieParts.length > 0){
cookieText += subCookieParts.join("&");
if(expires instanceof Date){
cookieText += "; expires=" + expires.toGMTString();
}
if(path){
cookieText += "; path=" + path;
}
if(domain){
cookieText += "; domain=" + domain;
}
if(secure){
cookieText += "; secure";
}
}else{
cookieText += "; expires=" + (new Date(0)).toGMTString();
}
document.cookie = cookieText;
},
unset: function(name, subName, path, domain, secure){
var subcookies = this.getAll(name);
if(subcookies){
delete subcookies[subName];
this.setAll(name, subcookies, null, path, domain, secure)
}
},
unsetAll: function(name, path, domain, secure){
this.setAll(name, null, new Date(0), path, domain, secure)
}
}
数据存储之HTTP Cookie的更多相关文章
- 浏览器本地数据存储解决方案以及cookie的坑
本地数据存储解决方案以及cookie的坑 问题: cookie过长导致页面打开失败 背景: 在公司的项目中有一个需求是打开多个工单即在同一个页面中打开了多个tab(iframe),但是需要在刷新时只刷 ...
- 本地数据存储解决方案以及cookie的坑
本地数据存储解决方案以及cookie的坑 问题: cookie过长导致页面打开失败 背景: 在公司的项目中有一个需求是打开多个工单即在同一个页面中打开了多个tab(iframe),但是需要在刷新时只刷 ...
- Web客户端数据存储学习笔记——Cookie
今天对登录访问的安全以及web客户端存储做了一些大致的学习,决定在这方面加深理解,记录在博客里.第一个接触到的是Cookie... WHAT? WHY? HOW? 在学习cookie的使用时发现其名称 ...
- 23. javacript高级程序设计-数据存储
1. 数据存储 1.1 cookie HTTP Cookie, cookie,最初用来在客户端存储回话信息. (1). 限制,不同浏览器对特定域名下的cookie 的个数有限制,每个域名下最好不要操过 ...
- 前端数据存储方案集合(cookie localStorage等)以及详解 (二)
前端数据存储方案集合(cookie localStorage等)以及详解 (二) 在之前的文章中已经介绍到了 前端存储方案中的 cookie . 但是 cookie 的存储上限是 4KB. 如果超过了 ...
- 数据存储的两种方式:Cookie 和Web Storage
数据存储的两种方式:Cookie 和Web Storage 1.Cookie Cookie的作用就像你去超市购物时,第一次给你办张购物卡,这个购物卡里存放了一些你的个人信息,下次你再来这个连锁超市时, ...
- JavaScript高级编程———数据存储(cookie、WebStorage)
JavaScript高级编程———数据存储(cookie.WebStorage) <script> /*Cookie 读写删 CookieUtil.get()方法根据cookie的名称获取 ...
- 数据存储的两种方式:Cookie 和Web Storage(转)
数据存储的两种方式:Cookie 和Web Storage 数据存储的两种方式:Cookie 和Web Storage 1.Cookie Cookie的作用就像你去超市购物时,第一次给你办张购物卡 ...
- 客户端数据存储cookie、localStoeage、sessionStorage(小记)
一.数据存储分为客户端存储和服务端存储 1.而对于客户端存储,在html5以前只能通过cookie来实现:html 5以后增加了web存储(实际保存本地)的功能 (1)对于web存储有两个标准: ...
随机推荐
- 漫话JavaScript与异步·第三话——Generator:化异步为同步
一.Promise并非完美 我在上一话中介绍了Promise,这种模式增强了事件订阅机制,很好地解决了控制反转带来的信任问题.硬编码回调执行顺序造成的"回调金字塔"问题,无疑大大提 ...
- HTTPS、证书与使用Charles抓包
.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font-size: 14.0px; font-family: "Helvetica Neue", & ...
- 【转】彻底理解js中this的指向,不必硬背。
首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...
- OwinHost.exe用法
简介 OwinHost.exe是微软提供的自宿主host,如果自己不想写owin的host,可以用这个. 官方对OwinHost的描述为:Provides a stand-alone executab ...
- Error:C:\Users\issuser\AndroidStudioProjects\SQLiteDemo1\.gradle\buildOutputCleanup\cache.properties (系统找不到指定的文件。)
android studio报下图中的这个错误的解决办法: 解决办法: 1.删除掉下图中标记的2个文件夹 2.将下图标记的文件的文件名重命名,把最后的后缀.lock去掉,因为加上了这个后缀,所以提示找 ...
- .net 平台下, Socket通讯协议中间件设计思路(附源码)
.net 平台下,实现通讯处理有很多方法(见下表),各有利弊: 序号 实现方式 特点 1 WCF 优点:封装好,方便.缺点:难学,不跨平台 2 RocketMQ,SuperSocket等中间件 优点: ...
- Struts2中访问web元素的四种方式
Struts2中访问web元素的四种方式如下: 通过ActionContext来访问Map类型的request.session.application对象. 通过实现RequestAware.Sess ...
- 使用神经网络来拟合函数y = x^3 +b
我们使用一个三层的小网络来,模拟函数y = x^3+b函数 import tensorflow as tf import numpy as np import matplotlib.pyplot as ...
- JS高级代码
JS 的defineProperties 设置多个属性 var book = {}; //用Object.defineProperties()方法设置多个属性 Object.definePropert ...
- 基于ssh框架的highcharts前后台数据交互实例
Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...