关于cookie的一些事

其实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

在一个域名下写入的cookie,想在另一个域名下读取,这就涉及到跨域cookie的操作。如果当前的两个域名的根域名一致,比如说之前在介绍cookie属性中提交的a.somesite.com和b.somesite.com的根域名都是somesite.com,这个当然好解决。但是如果根域名不一致呢?这就牵扯到jsonp的操作了,其原理就是通过访问异域的动态网页,让其返回一段js,但是这段js中包含cookie的值。
下面我们来看一段演示代码,为了演示方便,我们先把如下host添加到你的操作系统的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
配置文件2.1 hosts文件配置

写cookie的代码如下:
<?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');
代码片段2.1 写入cookie

我们通过www.a.com访问这个文件,那么浏览器中就写入了a.com的cookie了。
然后是www.a.com中部署的调用jsonp对应的代码:
<?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这个字符串。
好了,就是这么简单,想查看更多与本教程有关的测试代码可以从这里获取到:http://git.oschina.net/yunnysunny/cookie_test




猜你喜欢

转载自blog.csdn.net/yunnysunny/article/details/7748106