首先要明白一下cookie的概念。由于HTTP协议是一种无状态协议,也就是说一旦server和client的数据交换完成后,他们之间的连接就会被断开。再次交换数据的时候就须要再次建立连接。这就意味着server无法从连接上推断client。

为了解决问题,W3C引入了cookie机制。cookie就好比一个身份证,client请求server的时候。server将这个身份证颁发给client。client(浏览器)将这个身份证保存在本地。当下次连接server时。client携带这个身份证请求server。server依据身份证就可以确定用户身份。

cookie不仅client能訪问到,由于client请求server的时候会将cookie放在请求头里带到server,所以server也能对cookie进行操作。这里讨论使用javascript在client对cookie进行操作的方法。

一、写入cookie

写入cookie主要设置五个字段,内容、有效期、域名、路径、是否安全传输。

内容

cookie是以键值对形式保存的。要新建一个名为name,值为zhangsan的cookie就是“name=zhangsan”,仅仅需将这个cookie赋值给document.cookie就可以:

document.cookie = "name=zhangsan";  //加入cookie

document.cookie有读和写两种形式。上面这个形式便是写形式,写形式代表加入cookie,且一次仅仅能加入一条cookie。要加入多条则须要调用多次。如

document.cookie = "name=zhangsan;age=10"; //无效。仅仅加入了name。忽略age
document.cookie = "age=10"; //加入age

有效期

默认情况下。cookie在关闭浏览器的时候就会被清除。想让cookie存放更长时间能够通过设置expires字段实现。

expires字段须要的值是GMT(格林威治时间)格式的日期型字符串,能够用Date对象得到:

    var date = new Date();
//将时间设置成30分钟以后
date.setTime(date.getTime() + 30 * 60 * 1000);
//name=zhangsan将在30分钟后过期
document.cookie = "name=zhangsan;expires="+date.toGMTString();

想调整过期时间,仅仅须要改动setTime一行的代码。

域名

处于安全性的考虑,cookie是具有不可跨域性的。用户訪问百度的时候。百度为client颁发了一个cookie,用户再去訪问谷歌。谷歌给client颁发一个cookie。那么百度和谷歌是不能訪问到彼此的cookie的。

可是一般来说,我们訪问baidu.com的时候会发现,你是能够訪问到map.baidu.com的cookie的,这是由于给cookie设置了domian属性,由于map.baidu.com和baidu.com具有相同的域名baidu.com,所以能够为cookie设置domian值为baidu.com

document.cookie = "name=zhangsan;domain=baidu.com";

路径

相同道理。blog.csdn.net是訪问不到blog.csdn.net/sunhengzhe里面的cookie的(但反过来能够)。为了使上级文件夹訪问到下级文件夹,在blog.csdn.net/sunhengzhe里新建cookie时,能够为cookie设置path属性,一般能够直接将其设置为根文件夹

document.cookie = "name=zhangsan;path=/";

安全传输

cookie是保存在client本地的。所以查看cookie是非常方便,这也暴露了cookie的不安全性,所以一般cookie不存放如password等重要信息,secure属性并非用来设置cookie内容的安全性的,而是用于传输过程中的安全,设置secure后,仅仅保证 cookie 与server之间的传输数据过程加密,而保存在本地的 cookie文件并不加密。所以假设是想让本地保存的cookie也加密的话,最好在保存cookie值的时候就保存加密后的数据。

document.cookie = "name=zhangsan;secure";

二、读取cookie

读取cookie使用到document.cookie的读模式,返回的就是全部的cookie。中间用分号隔开。

document.cookie = "name=zhangsan";  //写
document.cookie = "age=10"; //写
console.log(document.cookie); //输出 name=zhangsan; age=10

三、删除、改动cookie

cookie并不提供删除、改动的方法,假设想改动某项cookie,仅仅需加入一个同名cookie。新的值将覆盖旧的值。

document.cookie = "name=zhangsan";
document.cookie = "name=lisi"; //name被改动为lisi

要删除cookie,仅仅需将该cookie有效期设置到当前时间曾经就可以。

var date = new Date();
//设置为前一毫秒(多前都能够)
date.setTime(date.getTime() - 1);
//删除name
document.cookie = "name=lisi;expires=" + date.toGMTString();

四、封装操作cookie的方法

使用原生方法对cookie操作是有些麻烦的,我们能够将其封装起来,name代表键名。value代表值,不填则为读取名为name的值。option代表设置值如有效期等。当中有效期单位为天。

    function cookie(name, value, options) {
if (typeof value != 'undefined') {
options = options || {};
//假设值为null, 删除cookie
if (value === null) {
value = '';
options = {
expires: -1
};
}
//设置有效期
var expires = '';
if (options.expires && (typeof options.expires == 'number' || options.expires.toGMTString)) {
var date;
if (typeof options.expires == 'number') {
date = new Date();
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
} else {
date = options.expires;
}
expires = ';expires=' + date.toGMTString();
}
var path = options.path ? ';path=' + (options.path) : '';
var domain = options.domain ? ';domain=' + (options.domain) : '';
var secure = options.secure ? ';secure' : '';
//设置cookie
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
} else {
//读取cookie
if (document.cookie.length > 0) {
var start = document.cookie.indexOf(name + "=")
if (start != -1) {
start = start + name.length + 1;
var end = document.cookie.indexOf(";", start);
if (end == -1){
end = document.cookie.length;
}
return decodeURIComponent(document.cookie.substring(start, end));
}
}
return ""
}
} cookie("name", "zhangsan"); //加入name=zhangsan
cookie("name", null); // 删除name
cookie("age", "10", {
expires: 30
}); // 加入age=10且有效期30天

javascrip cookie的更多相关文章

  1. javascrip中cookie的使用详细分析

    JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...

  2. JavaScrip操作Cookie

    //生成cookie function addCookie(sName, sValue, day) { var expireDate = new Date(); expireDate.setDate( ...

  3. 超大 Cookie 拒绝服务攻击

    有没有想过,如果网站的 Cookie 特别多特别大,会发生什么情况? 不多说,马上来试验一下: for (i = 0; i < 20; i++) document.cookie = i + '= ...

  4. IE10、IE11 User-Agent 导致的 ASP.Net 网站无法写入Cookie 问题

    你是否遇到过当使用一个涉及到Cookie操作的网站或者管理系统时,IE 6.7.8.9下都跑的好好的,唯独到了IE10.11这些高版本浏览器就不行了?好吧,这个问题码农连续2天内遇到了2次.那么,我们 ...

  5. 解决cookie跨域访问

    一.前言 随着项目模块越来越多,很多模块现在都是独立部署.模块之间的交流有时可能会通过cookie来完成.比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入c ...

  6. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  7. 一个诡异的COOKIE问题

    今天下午,发现本地的测试环境突然跑不动了,thinkphp直接跑到异常页面,按照正常的排错思路,直接看thinkphp的log 有一条 [ error ] [2]setcookie() expects ...

  8. [转载]Cookie/Session的机制与安全

    Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道.本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题. 因 ...

  9. jquery.cookie的使用

    今天想到了要为自己的影像日记增加赞的功能,并且需要用到cookie. 记得原生的js操作cookie也不是很麻烦的,但似乎jquery更简单,不过相比原生js,需要额外引入2个文件,似乎又不是很好,但 ...

随机推荐

  1. Nginx 拒绝指定IP访问

    来源 : http://www.ttlsa.com/nginx/nginx-deny-ip-access/   闲来无事,登陆服务器,发现有个IP不断的猜测路径.试图往服务器上传文件(木马).于是查看 ...

  2. J2SE知识点摘记(十六)

    1.         IO包中的类层次 ┌BufferedInputStream ├DataInputStream ┌FilterInputStream┼LineNumberInputStream ├ ...

  3. 修改SlidingMenu,使其能够完美运行

    今天想给项目添加一个侧边栏的效果,使用到了https://github.com/jfeinstein10/SlidingMenu这个开源项目.项目本身可以通过github下载.此项目同时又依赖于一个名 ...

  4. sqoop安装与使用

    sqoop简介 sqoop名字是怎么来的?Sqoop: SQL-to-Hadoop 连接传统数据库和hadoop的桥梁,把关系型数据库的数据导入到hadoop系统(如HDFS,HBASE和hive中) ...

  5. 安装python模块

    要想在python中使用import的一些模块,前提是要安装这些模块. 可以使用pip来导入模块. 打开终端,输入命令: sudo easy_install pip 安装好pip后,就可以使用pip来 ...

  6. Tiny Spring 分析一

    近期一直想看spring的源代码,可是奈何水平太低,庞杂的源代码令我一阵阵的头晕. 非常有幸,在网上看到了黄亿华大神的<<1000行代码读懂Spring(一)- 实现一个主要的IoC容器& ...

  7. 机器学习Matlab打击垃圾邮件的分类————朴素贝叶斯模型

    该系列来自于我<人工智能>课程回顾总结,以及实验的一部分进行了总结学习机 垃圾分类是有监督的学习分类最经典的案例,本文首先回顾了概率论的基本知识.则以及朴素贝叶斯模型的思想.最后给出了垃圾 ...

  8. CSS用法简介

    CSS(Cascading Style Sheets层叠样式表)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言. 1.基本使用语法   ...

  9. 关于响应式、媒体查询和media的关系 、流媒体布局flex 和em rem像素的使用 我有一些废话要讲.....

    一.什么是响应式 随着移动端越来遇火 网站的布局成为一个热议的话题 有的人喜欢用手机浏览网站.有的人喜欢用paid浏览网站.有人喜欢用电脑浏览网站 那么问题来了 我们怎么样才能使用一套css样式 完成 ...

  10. 小鱼提问1 类中嵌套public修饰的枚举,外部访问的时候却只能Class.Enum这样访问,这是为何?

    /// <summary> /// 常量等定义 /// </summary> public class General { /// <summary> /// 文件 ...