Javascript操纵Cookie--转
引用地址:http://www.imkevinyang.com/2009/06/javascript%E6%93%8D%E7%BA%B5cookie.html
在讲如何使用Javascript操纵Cookie时,我们先来了解一下Cookie的基本常识。
Cookie,又称Http Cookie,是存储在客户端本地的一小段信息。我们可以简单地把Cookie理解为客户端浏览器上的一个小硬盘,我们会在上面存取一些信息,通常用作Http状态的维护,现在也经常被用作跟踪用户行为的一种常见方式。
Session cookies - these are temporary and are erased when you close your browser at the end of your surfing session. The next time you visit that particular site it will not recognise you and will treat you as a completely new visitor as there is nothing in your browser to let the site know that you have visited before。
Persistent cookies - these remain on your hard drive until you erase them or they expire. How long a cookie remains on your browser depends on how long the visited website has programmed the cookie to last。
Cookie的属性
每一个Cookie都有如下几个属性:
- 名称
- 值
- 主机域
- 路径
- 安全级别
- 过期时间
其中“名称”、“主机域”,“路径”三者一起唯一标识了一个Cookie。
大多数Cookie在设置的时候都只是显式的设置了Cookie的名称和值,这种情况下,浏览器会自动的使用location.host来设置Cookie的主机域,将路径设置到根目录“/”下。例如,当你在www.example.com上面使用document.cookie="name=value"设置了一个Cookie,那么这个Cookie就拥有了如下属性:
- 名称 —— name
- 值 —— value
- 主机域 —— www.example.com
- 路径 —— /
- 安全级别 —— No
- 过期时间 —— 浏览器会话结束(关闭浏览器)
第一方和第三方Cookie的区别
第一方Cookie指的是设置在当前网站域上面的Cookie,而第三方Cookie指的是设置在其他域上的Cookie。
第一方Cookie比较好理解,我们通常遇到的都是属于第一方Cookie。在客户端Javascript中,我们只能操纵第一方Cookie,也就是说,我们不能在www.example.com主机上,设置www.google.cn的Cookie,这样就乱套了。
第三方Cookie不容易让人注意到。假设我们在公司网站www.example.com上面使用了map.google.com的地图服务,而Google地图在使用时又希望在用户这边设置一些Cookie,就跟用户直接访问自家网站(map.google.com)一样,如Session信息等,那么它会在返回的HTTP Response中包含set-cookie的报头,但由于是第三方域,存在安全问题,所以必须还在响应中包含一个P3P的主机头(P3P头中存的是隐私策略的摘要)来实现Cookie的第三方存取(注意,此时Cookie还是设置在b.com上面的)。IE中可以设置对第三方Cookie存取的限制。
Javascript操纵Cookie
在客户端使用Javascript操纵Cookie存在很多的不便之处,例如在读取Cookie的时候,只能通过手动解析document.cookie字符串得到指定cookie的值,不能得到其他任何信息,如设置的主机,路径以及过期时间等。
/** * 查询指定名称的Cookie值 * @note 需要注意有可能出现同名cookie的问题 * @param {Object} key * @param {Object} 设置当读取不到key时返回的默认值 * @return {String} 返回读取到的Cookie的值, * 如果读取不到相应的Cookie,则判断defValue是否有效,有效则返回defValue,否则返回null */function getCookie(key,defValue){ var cookie,value; if(!key){ return null; } cookie = document.cookie; // 所有cookie的key都小写化处理 key = key.toLowerCase(); value = find(cookie,key+"=",";",null,false,null); return value === null ? defValue : unescape(value);}/** * 设置cookie * @param {String} key * @param {String} value * @param {Number} expires 单位为秒 * @param {String} path 路径 * @param {String} domain 主机 * @param {Boolean} secure 安全级别 */function setCookie(key, value, expires, path,domain,secure){ // key无效则不做任何操作 if(!key){ return; } // 所有cookie的key都小写化处理 key = key.toLowerCase(); key = key + '=' + escape(value) + ";"; expires = expires ? ("expires=" + new Date(new Date().getTime() + expires * 1000).toGMTString()) + ";" : ""; path = !!path ? "path=" + path + ";" : "path=/;"; domain = domain ? ("domain=" + domain) + ";" : ""; secure = secure ? "secure=true;" : ""; document.cookie =[key,expires,path,domain,secure].join("");}/** * 删除指定Cookie * @param {Object} key * @param {Object} path * @param {Object} domain */function delCookie(key,path,domain){ // 超时设置为过去的时间,cookie会立即失效 key = key.toLowerCase(); setCookie(key,"",-1000,path,domain); }/** * 从字符串中获取夹在指定前缀和后缀之间的值 * @example * userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.2) Gecko/2008082714 Firefox/3.0.2" * * prefix="windows nt" * suffix=";" * find(userAgent,prefix,suffix) returns " 5.2"; * @param {Object} str 源字符串 * @param {Object} prefix 前缀 * @param {Object} suffix 结束符,若不指定,则匹配到字符串结尾;如果指定了,但是匹配不到,则同样匹配到字符串结尾。 * @param {Boolean} matchFirstOnly 是否找到第一个匹配项,设置为false则查找最后一个匹配项,默认为false * @param {Boolean} ignoreCase 忽略大小写来查找,默认值为true * @param {Boolean} trimBlank 是否删除值首尾的空白符,默认值为true * @return {String} 查找到的字符串,若找不到则返回null */function find(str,prefix,suffix,matchFirstOnly,ignoreCase,trimBlank){ var start,end,middle,value=null; matchFirstOnly = (matchFirstOnly === true); ignoreCase = (ignoreCase !== false); trimBlank = (trimBlank !== false); // 如果忽略默认值 if(ignoreCase){ str = str.toLowerCase(); prefix = prefix.toLowerCase(); suffix = suffix && suffix.toLowerCase(); } if(matchFirstOnly){ start = str.indexOf(prefix); }else{ start = str.lastIndexOf(prefix); } if (start > -1) { // 如果没有指定后缀,则直接匹配到字符串结尾 middle = start + prefix.length; if (!suffix) { value = str.substring(middle); } else { end = str.indexOf(suffix, middle); if (end > -1) { value = str.substring(middle, end); } else { value = str.substring(middle); } } if(trimBlank){ value = value.replace(/^\s*(.*?)\s*$/, '$1'); } } return value;} |
Javascript操纵Cookie--转的更多相关文章
- js操纵cookie技术
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- JavaScript 操作 Cookie
转自作者:聂微东出处:http://www.cnblogs.com/Darren_code/ 什么是 Cookie “cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器 ...
- JavaScript操作Cookie
在Web开发中,我们经常使用Cookie保存一些不是非常敏高的数据.比如“下次自动登录”,“广告显示”等功能.定义是:某些网站为了辨别用户身份而存储在用户本地终端(主要是浏览器)上的数据.定义域RFC ...
- javascript控制cookie
参考:http://www.cnblogs.com/ly312/archive/2010/07/14/1777190.html function getCookies(name) { var arr ...
- JavaScript中Cookie的用法
Javascript中Cookie主要存储于客户端的计算机中,用于存放已访问的站点信息,Cookie最大约为4k.以下实例主要用于页面在刷新时保存数据,具体的用法如下所示: <html> ...
- JavaScript之Cookie讲解
什么是 Cookie “cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScript 来创建和取回 cookie ...
- javascript笔记——cookie解析
JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...
- Cookie介绍及JavaScript操作Cookie方法详解
本文主要为大家简单介绍了以下Cookie的用途.运行机制,以及JavaScript操作Cookie的各种方法,总结的比较全面,希望能给大家带来帮助. 什么是 Cookie “cookie 是存储于访问 ...
- JavaScript之cookie
JavaScript通过Cookie实现简单的用户登录状态的保存.Cookie可以跨越多个网页使用,但不能跨域名使用,也不同跨浏览器使用. 1.设置cookie function SetCookie( ...
随机推荐
- 得到python某个模块的路径
#-*-coding:utf-8-*- # 导入imp模块 import imp # 打印出MySQLdb模块 print imp.find_module("MySQLdb")
- 前端复习-02-ajax原生以及jq和跨域方面的应用。
ajax这块我以前一直都是用现成的jq封装好的东西,而且并没有深入浅出的研究过,也没有使用过原生形式的实现.包括了解jsonp和跨域的相关概念但是依然没有实现过,其中有一个重要的原因我认为是我当时并不 ...
- Kali Linux 安装教程-转
rootoorotor昨天折腾了 Kali Linux 1.0,把大概的配置过程记录下来,希望对想接触或使用Kali Linux的同学有所帮助. 请注意: 1.本文为面向新手的教程,没技术含量,没 ...
- JVM系列一:JVM内存组成及分配
java内存组成介绍:堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时 ...
- 异步编程之Promise(3):拓展进阶
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- Struts ForwardAction Example
In Struts MVC model, you have to go thought the Action Controller to get a new view page. In some ca ...
- PCB中层的定义(一)
- Xcode环境配置mysql
本文默认mysql安装目录为/usr/local/mysql 在项目的header search paths中添加/usr/local/mysql/includ 2.在项目的library searc ...
- 【PAT】1020. Tree Traversals (25)
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...
- ssh 框架整合试例 (spring+struts2+hibernate)
1.首先用Eclipse创建一个web项目(Eclipse EE 版) new->Other-> 输入web 然后选择Dynamic Web Project->next-> 输 ...