其实cookie是实现web中用户状态维护的基础。我们常见的session也是在客户端浏览器中保存一个cookie信息,里面含sessionid数据,而在服务器端有一段与此sessionid关联的数据,这段数据可以存在服务器硬盘上,也可以序列化后存储在服务器的内存中,如果自己实现session过程的话,甚至可以存储在数据库或者nosql中。在做session验证的时候,正式用此sessionid去查找服务器上的相应信息。
cookie的属性
在理解cookie之前,先得介绍一下它的几个属性。
属性 | 介绍 |
name | cookie的名字 |
value | cookie的取值 |
expires | 过期时间,如果这个属性不指定的话,就是“session cookie”,也就是这个session在关闭浏览器后会被删除 |
path | cookie的作用域,子文件夹下的网页可以访问父文件夹下的网页生成的cookie,但是反过来却不能。例如在/路径下生成了cookie_a,在/sub路径下生成了cookie_b,则/路径下只能读取cookie_a,而/sub路径下可以读取cookie_a和cookie_b。注意,如果不设置这个属性的话,默认使用的是当前的url的相对路径,例如在url http://www.a.com/some/page.php中设置cookie时没有指定path路径,则它的path属性为/some。一般我们设置cookie,就是让网站中所有其他的网页都能读取到的,所以应该将其设置为'/'。 |
domain | cookie的所属域名,默认是全域名,例如www.somesite.com。当然也可以自己指定根域名,即somesite.com,这样的话如果当前网站旗下有子域名网站的话,例如a.somesite.com b.somesite.com之类的子域名,那么在子域名所在网站中也能读取这个cookie。 |
secure | 这个属性是针对https来说的,如果设定其为true的话,那么只有在请求当前网站的https的地址的时候,才能读取出来。 |
httponly | 这个属性设置js对于当前cookie的读取权限,如果为true,则js无法读取修改当前cookie |
cookie使用的注意事项:
1.cookie的value内容中是无法使用特殊字符和中文的。不支持的特殊字符有空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号等(以上符号是cookie的 version 0 版本的情况,不同服务器支持的情况不同,有些特殊符号在支持version 1版本的服务器上是支持的),如果使用这些符号,cookie内容就会被截断,服务器会丢弃特殊符号和特殊符号之后的内容。所以在使用的时候要对其进行转义,js中可以使用escape和unescape;jsp中可以使用URLEncode和URLDecode(这两个函数可以自行设置编码);php中使用urlencode和urldecode(这两个函数内部使用gb2312进行中文转化)。如果遇到用js设置cookie,在后台读取的情况,js端可以用encodeURIComponent进行转码(这个函数使用utf-8进行中文转化)。
2.在服务器端的对网页A设置了cookie,如果使用浏览器回退功能,回退到的页面B上,是读取不到刚才设置的cookie的,这种情况下必须手动刷新浏览器才能得到A页面设置的cookie。在某些服务器上即使使用js跳转到B页面也读取不到cookie,而且这种情况在php的服务器上出现,所以对于设置cookie后的操作最好采用服务器端语言进行浏览器跳转,比如php中的header函数。
跨域cookie
127.0.0.1 www.a.com
127.0.0.1 sub1.a.com
127.0.0.1 sub2.a.com
127.0.0.1 www.b.com
<?php
/**
* 设置如下hosts:
* 127.0.0.1 www.a.com
* 127.0.0.1 sub1.a.com
* 127.0.0.1 sub2.a.com
* 127.0.0.1 www.b.com
* 通过www.a.com访问本文件
*
*/
date_default_timezone_set("PRC");
header("P3P: CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"");//ie中需要设置一个p3p头,否则在跨域中获取不到cookie
setcookie('some','value',time()+60*60,'/','a.com');
<?php
/**
* cookie的设置参见setcookie.php
*
*/
$value = '';
isset($_COOKIE['some']) && $value = $_COOKIE['some'];
header('HTTP/1.1 200 OK');
header('Content-Type: text/javascript');
$str = '{ticket : "'.$value.'"}';
//通过www.b.com访问本文件,这里在访问的时候加一个callback参数,以标示访问地为异域,jquery中使用这个参数来实现jsonp的回调
if (isset($_GET['callback']) && $_GET['callback']) {
$str = $_GET['callback'].'('.$str.')';
} else {//通过sub1.a.com或者sub2.a.com访问本文件,直接获取到cookie
}
echo $str;//打印一段js代码
代码片段2.2 读取cookie的jsonp代码
最后我们在www.b.com的域名下访问以下调用jsonp的html页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<meta name="Author" content="sunny">
<meta name="Keywords" content="">
<meta name="Description" content="">
<script language="javascript" src="jquery-1.10.1.js" ></script>
</head>
<body>
<script type="text/javascript">
//通过www.b.com域名访问本网页
$(document).ready(function() {
$.getJSON('http://www.a.com/cookie/getcookie.php?callback=?',function(json) {
//if(typeof(console) != 'undefined') {
//console.log(json.ticket);//在控制台上查看打印信息
//} else {
alert(json.ticket);
//}
});
});
</script>
</body>
</html>
代码片段2.3 读取cookie的异域html代码
js中的alert函数会打印出value这个字符串。