燕之庐网站建设 - 优质网站设计公司

Posts Tagged ‘cookie’

php

2009/10/25

抛开cookie使用session

Tags: ,

抛开cookie使用session
PHP中SESSION不能跨页传递问题的解决办法

在PHP中使用过SESSION的朋友可能会碰到这么一个问题,SESSION变量不能跨页传递。这令我苦恼了好些日子,最终通过查资料思考并解决了这个问题。我认为,出现这个问题的原因有以下几点:
1、客户端禁用了cookie
2、浏览器出现问题,暂时无法存取cookie
3、php.ini中的session.use_trans_sid = 0或者编译时没有打开–enable-trans-sid选项

为什么会这样呢?下面我解释一下:

Session 储存于服务器端(默认以文件方式存储session),根据客户端提供的session id来得到用户的文件,取得变量的值,session id可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器 读取Session的目录……。也就是说,session id是取得存储在服务上的session变量的身份证。当代码session_start();运行的时候,就在服务器上产生了一个session文件, 随之也产生了与之唯一对应的一个session id,定义session变量以一定形式存储在刚才产生的session文件中。通过session id,可以取出定义的变量。跨页后,为了使用session,你必须又执行session_start();将又会产生一个session文件,与之对应 产生相应的session id,用这个session id是取不出前面提到的第一个session文件中的变量的,因为这个session id不是打开它的“钥匙”。如果在session_start();之前加代码session_id($session id);将不产生新的session文件,直接读取与这个id对应的session文件。

PHP中的session在默认情况下是使用客户 端的Cookie来保存session id的,所以当客户端的cookie出现问题的时候就会影响session了。必须注意的是:session不一定必须依赖cookie,这也是 session相比cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这种附着也是有一定条件的,即“php.ini中的session.use_trans_sid = 1或者编译时打开打开了–enable-trans-sid选项”。

用过论坛的朋友都知道,在进入论坛的时候,往往会提示你检查 Cookie是否打开,这是因为大多数论坛都是基于Cookie的,论坛用它来保存用户名、密码等用户信息,方便使用。而且很多朋友都认为Cookie不 安全(其实不是这样),往往禁用它。其实在PHP程序中,我们完全可以用SESSION来代替Cookie,它可以不依赖于客户端是否开启Cookie。

所以,我们可以抛开cookie使用session,即假定用户关闭cookie的情况下使用session,其实现途径有以下几种:

1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了–enable-trans-sid选项,让PHP自动跨页传递session id。
2、手动通过URL传值、隐藏表单传递session id。
3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。

途径1举例说明:

s1.php

<?php
session_start();
$_SESSION[’var1’]=”中华人民共和国”;
$url=”<a href=”.”"s2.php”>下一页</a>”;
echo $url;
?>

s2.php

<?php
session_start();
echo “传递的session变量var1的值为:”.$_SESSION[’var1’];
?>

运行以上代码,在客户端cookie正常的情况下,应该可以在得到结果“中华人民共和国”。
现在你手动关闭客户端的cookie,再运行,可能得不到结果了吧。如果得不到结果,再“设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了–enable-trans-sid选项”,又得到结果“中华人民共和国”

途径2举例说明:

s1.php

<?php
session_start();
$_SESSION[’var1’]=”中华人民共和国”;
$sn = session_id();
$url=”<a href=”.”"s2.php?s=”.$sn.”">下一页</a>”;
echo $url;
?>

s2.php

<?php
session_id($_GET[’s’]);
session_start();
echo “传递的session变量var1的值为:”.$_SESSION[’var1’];
?>

隐藏表单的方法基本原理同上。

途径3举例说明:

login.html

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<title>Login</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
</head>
<body>
请登录:
<form name=”login” method=”post” action=”mylogin1.php”>
用户名:<input type=”text” name=”name”><br>
口 令:<input type=”password” name=”pass”><br>
<input type=”submit” value=”登录”>
</form>
</body>
</html>

mylogin1.php

<?php

$name=$_POST[’name’];
$pass=$_POST[’pass’];
if(!$name || !$pass) {
echo “用户名或密码为空,请<a href=”login.html”>重新登录</a>”;
die();
}
if (!($name==”laogong” && $pass==”123″) {
echo “用户名或密码不正确,请<a href=”login.html”>重新登录</a>”;
die();
}
//注册用户
ob_start();
session_start();
$_SESSION[’user’]= $name;
$psid=session_id();
$fp=fopen(”e:\tmp\phpsid.txt”,”w+”;
fwrite($fp,$psid);
fclose($fp);
//身份验证成功,进行相关操作
echo “已登录<br>”;
echo “<a href=”mylogin2.php”>下一页</a>”;

?>

mylogin2.php

<?php
$fp=fopen(”e:\tmp\phpsid.txt”,”r”;
$sid=fread($fp,1024);
fclose($fp);
session_id($sid);
session_start();
if(isset($_SESSION[’user’]) && $_SESSION[’user’]=”laogong”  {

echo “已登录!”;
}
else {
//成功登录进行相关操作
echo “未登录,无权访问”;
echo “请<a href=”login.html”>登录</a>后浏览”;
die();
}

?>

同样请关闭cookie测试,用户名:laogong 密码:123  这是通过文件保存session id的,文件是:e: mpphpsid.txt,请根据自己的系统决定文件名或路径。

至于用数据库的方法,我就不举例子了,与文件的方法类似。

总结一下,上面的方法有一个共同点,就是在前一页取得session id,然后想办法传递到下一页,在下一页的session_start();代码之前加代码session_id(传过来的session id);

php

使cookie实现跨域名

Tags: ,

Cookie真是一个伟大的发明,它允许web开发者保留他们的用户的登录状态。然而,当你的站点或网络有一个以上的域名时就会出现问题了。
在Cookie规范上说,一个cookie只能用于一个域名,不能够发给其它的域名。因此,如果在浏览器中对一个域名设置了一个cookie,这个 cookie对于其它的域名将无效。如果你想让你的用户从你的站点中的其中一个进行登录,同时也可以在其它域名上进行登录,这可真是一个大难题。
我的解决方案将使用下面的一般框架:

一 个预置的脚本将用来接受通过GET或COOKIE方式传递过来的sessionid号。它将比COOKIE优先选择GET变量。所以,无论何时需要引用交 叉的域名时,我们把sessionid做为一个URL参数进行发送。修改Apache配置,用来实现重写所有的交叉域名的cookie。这样做的原因一会 儿就会清楚了。在任何时候出现一个交叉域名引用时使用变量。
第一步:创建预置脚本
将下面的代码加到预置脚本中(或出现在所有脚本之前的函数中)。

<?php

/* 支持交叉域名cookie… */

// 如果GET变量已经设置了,并且它与cookie变量不同
//则使用get变量(更新cookie)
global $HTTP_COOKIE_VARS, $HTTP_GET_VARS;
if (isset($sessionid) && isset($HTTP_GET_VARS['sessionid']) && ($HTTP_COOKIE_VARS['sessionid'] != $HTTP_GET_VARS['sessionid'])) {
SetCookie(’sessionid’, $HTTP_GET_VARS['sessionid'], 0, ‘/’, ”);
$HTTP_COOKIE_VARS['sessionid'] = $HTTP_GET_VARS['sessionid'];
$sessionid = $HTTP_GET_VARS['sessionid'];
}

?>

一旦这个代码运行之后,一个全局的’sessionid’变量将可以用于脚本。它将保存着用户的cookie中的sessionid值,或者是通过GET请求发来的sessionid值。
第二步:为所有的交叉域名引用使用变量
创建一个全局的配置文件,用于存放可以进行切换的域名的基本引用形式。例如,如果我们拥有domain1.com和domain2.com,则如下设置:

<?php

$domains['domain1'] = “http://www.domain1.com/-$sessionid-”;
$domains['domain2'] = “http://www.domain2.com/-$sessionid-”;

?>

现在,如果在代码中如下做:

<?php

echo “Click &lt;a href=\”", $domains['domain2'], “/contact/?email=yes\”&gt;here&lt;/a&gt; to contact us.”;

?>
你将产生如下的输出:

Click <a href=”http://www.domain2.com/-66543afe6543asdf6asd-/contact/?email=yes\”>here</a>
to contact us.

在这里sessionid已经被插入到URL中去了。

在这个地方,你可能会想”这样可能会在web服务器上打开名为横线,sessionid,横线的子目录?!?!?”。然而,下面的步骤将提供一个必需的戏法,以便让它能够使用!
第三步:配置Apache
现在,剩下的步骤就是配置apache来重写这个URL:

http://www.domain2.com/-66543afe6543asdf6asd-/contact/
变成这样:

http://www.domain2.com/contact/?sessionid=66543afe6543asdf6asd
并且这种url:

http://www.domain2.com/-66543afe6543asdf6asd-/contact/?email=yes
变成这样:

http://www.domain2.com/contact/?email=yes&sessionid=66543afe6543asdf6asd
为了实现它,简单地配置两个虚拟服务器,作为domain1和domain2,如下操作:

<VirtualHost ipaddress>
DocumentRoot /usr/local/www/domain1
ServerNamewww.domain1.com
RewriteEngine on
RewriteRule ^/-(.*)-(.*\?.*)$ $2&sessionid=$1 [L,R,QSA]
RewriteRule ^/-(.*)-(.*)$ $2?sessionid=$1 [L,R,QSA]
</VirtualHost>

<VirtualHost ipaddress>
DocumentRoot /usr/local/www/domain2
ServerNamewww.domain2.com
RewriteEngine on
RewriteRule ^/-(.*)-(.*\?.*)$ $2&sessionid=$1 [L,R,QSA]
RewriteRule ^/-(.*)-(.*)$ $2?sessionid=$1 [L,R,QSA]
</VirtualHost>

这些重写的规则实现了上面两个URL重写的要求。

结论
通过使用变量结合与apache的重写功能,交叉域名cookie可以以一种简单的方式实现。想要维护这样的系统,无论什么时候链接交叉域名,在使用域名变量之外,什么也不用作了!在域名内部的链接不需要进行修改,因为cookie会工作正常。

如果你有兴趣看一下在生产网络中实际运作中的系统,请参观http://www.familyhealth.com.au/。在一些交叉域名链接上移动你的鼠标,并且看一下当你点击后它们是如何被重写的。

也许,使用这个技术唯一的问题就是无法删除在用户浏览器中的全部域名下的cookie。

php

cookie与session

Tags: ,

在很多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用 一组变量来“追随”访客。实现变量“追随”有很多种方法,比较用得多的是cookie和session。下面我们用时下很流行的PHP为大家讲解一下它们 的使用。

一.Cookie的使用

Cookie是网站保存在浏览器客户端的信息,也就是说保存在访客的机器里的变量,一 般随着HTTP头发送到客户端。在Cookie生效之后及失效之前,客户每次发出页面请求的时候,都会把Cookie一块发送到服务器,只要我们针对它进 行相应的处理,就可以实现变量“追随”。

1. 设置一个Cookie变量
设置一个Cookie变量,PHP使用的函数是: int setcookie(string name, string value, int expire,
string path, string domain, int secure);
其中name是Cookie变量名称标识,你在PHP中将可以象使用普通变量名一样来用它引用Cookie变量。value是Cookie变量的初始 值,expire 表示该Cookie变量的有效时间;path 为该Cookie变量的相关路径;domain 表示Cookie变量的网站;secure 则需在 https 的安全传输时才有效。   例如我们要设置一个变量username,它的值是字符串“bluewind”,我们可以这么写代码: setcookie (“username”,“bluewind”); //这两个参数是setcookie必要的。
我们还想给这个变量设置有效时间来限制操作超时等,比如说10分钟: setcookie (“username”,“bluewind”, 600000); //有效时间的单位是毫秒。
注意:setcookie和header函数一样,需要放在任何能向客户端输出的语句之前。

2. 销毁一个变量
销毁Cookie变量只要将它的value设为空(“”)就可以了,如想销毁上面那个变量只要再写一次: setcookie (“username” ,“”);
就可以了。这常用作安全退出之用。

3. Cookie的有效范围和生存期
Cookie的有效范围(也就是说在这个范围的页面都能得到这个Cookie变量)默认的是该目录及其子目录,当然你可以用setcookie的 path和domain参数进行修改。如果你不对cookie的expire进行设置(参见1. 设置一个Cookie变量中的例子),那么当你离开网站的页面,cookie也同时得到自动销毁。   http://www.netscape.com/newsref/std/cookie_spec.html是 cookie 原创者 Netscape 所提供的完整介绍信息。

二,session的使用
session变量,也就是会话级变量,是访客在整个和网站交互的过程中都存在的公有变量。在客户端不支持有可能不支持cookie的时候(比如 linux下的lynx……呵呵,惨了点),我们为了保证数据正确安全,就需要采用session变量。Session在各种网页语言中的实现方式不一 样,PHP在4.0后也开始支持它了。首先,让我们来看看一个简单的例子:

test.php
———–
<?
session_start();
session_register(var); //注册变量var
$var=”这是SESSION变量的值”; //var变量已经被作为session变量
?>

test1.php
——
<?
session_start();
session_register(var);
echo $var; //输出:“这是SESSION变量的值”
?>

1、初始一个session
如果PHP的设置自动session并没有开启的话,需要使用session_start()函数来初始化一个session,这个函数的用法如下:
: boolean session_start(void);
它的作用是初始化一个新的 Session,若该客户已在 Session 之中,则连上原 Session。本函数没有参数,且返回值均为 true。

2、在session中注册一个变量
你要在session保存的变量都必须使用下列函数对变量进行注册: boolean session_register(string name);
本函数在全局变量中增加一个变量到目前的 Session 之中。参数 name 即为欲加入的变量名。成功则返回true 值。然后你就可以直接使用变量名对它进行赋值,这个值就会被保存下来。

3、使用session变量的值
如上例所示,只要你再在新的页面重复上两个步骤(除了赋值外),就可以直接使用session变量。

4、session的销毁
如果你只是想注销一个变量而不是摧毁整个变量的话,那需要使用函数:boolean session_unregister(string name);
用法很简单,参数 name 即为欲删除的变量名。成功则返回 true 值。但是,如果要整个“摧毁”session变量的话,比如说安全退出什么的,使用函数: boolean session_destroy(void);
本函数结束目前的 Session。本函数没有参数,且返回值均为 true。

5、其它有用的session函数

a、 检查变量是否注册 boolean session_is_registered(string name);
本函数可检查目前的 Session 之中是否已有指定的变量注册。参数 name 即为欲检查的变量名。成功则返回true 值。

b、 给注册变量归null void session_unset(void);
这个函数可以把当然注册的所有的session变量置为空。注意它不是unregister,也不同于destroy。 下面这个例子,对此函数做了很好的说明。
<?php
session_register(’a',’b',’c'); //auto-session-start
$a=1;
$b=2;
$c=3;
session_unregister(’a'); //unregistrered $a
echo “A: $a – reg:”.session_is_registered(’a').” “;
// but the global $a remains
session_unset(); // unsets $b und $c
echo “B:$b – reg:”.session_is_registered(’b').” “;
// the registration remains !
echo “C:$c – reg:”.session_is_registered(’c').” “;
echo session_encode();
?>
输出:
A: 1 – reg:
B: – reg:1
C: – reg:1
!b|!c| c、定制你自己的session处理方法
void session_set_save_handler (string open, string close, string read,
string write, string destroy, string gc)

这个函数可以定义用户级的session的保存函数(打开、关闭、写入等)。比如,我们想把session保存在本地的一个数据库中时,本函数就很有用 了。缺省情况下,每个session存贮在系统临时目录的一个个独立文件中(例如在unix系统中为/tmp)。这适合或不适合,依你的需求而言。例如: 如果你的支持php的web服务器分布在不同的机器上,你不能很容易地共享它们之间的session(当然,你也可以将sessions保存在NFS共享 中)。另一个潜在的问题是你机器上的数千或数百万个session文件使你的文件系统变得散乱 。注意:这个函数是在4.0b4版本后才出现的。使用本函数前,先要配置php.ini文件,session.save_hadler=user ,否则,session_set_save_handler()不会生效。
此外,根据我的测试,你如果想让这样的session跨页面使 用,还要在每一个用到session的脚本文件中加入你自定的函数及session_set_save_handler,所以,最好的方法是做成一个单独 的文件,在每一个要用到session的脚本中用include来包含进来。
下面这个例子提供了一个最基本的session保存法,类似于默认的files方法。如果你想用数据库来实现,这也是很容易做到的。

Example:session_set_save_handler() example

<?php
function open ($save_path, $session_name) {
global $sess_save_path, $sess_session_name;
$sess_save_path = $save_path;
$sess_session_name = $session_name;
return(true);
}
function close() {
return(true);
}
function read ($id) {
global $sess_save_path, $sess_session_name;
$sess_file = “$sess_save_path/sess_$id”;
if ($fp = @fopen($sess_file, “r”)) {
$sess_data = fread($fp, filesize($sess_file));
return($sess_data);
} else {
return(”");
} } function write ($id, $sess_data) {
global $sess_save_path, $sess_session_name;
$sess_file = “$sess_save_path/sess_$id”;
if ($fp = @fopen($sess_file, “w”)) {
return(fwrite($fp, $sess_data));
} else {
return(false);
}
}
function destroy ($id) {
global $sess_save_path, $sess_session_name;
$sess_file = “$sess_save_path/sess_$id”;
return(@unlink($sess_file));
} /*********************************************
* WARNING – You will need to implement some *
* * sort of garbage collection routine here. *
* *********************************************/
function gc ($maxlifetime) {
return true;
}
session_set_save_handler
(”open”, “close”, “read”, “write”, “destroy”, “gc”);
session_start();
// proceed to use sessions normally
// 现在你就可以象往常一样地使用session了。 ?>

php

2009/10/19

Cookie及其使用(一)

Tags: ,

Cookie技术是一个非常有争议的技术,自经诞生它就成了广大网络用户和Web开发人员的一个争论焦点。有一些网络用户,甚至包括一些资深的Web专家 也对它的产生和推广感到不满,这倒不是因为Cookie技术的功能太弱或别的技术性能上的原因,而仅仅是因为他们觉得Cookie的使用,对网络用户的隐 私构成了危害。因为Cookie是由Web服务器保存在用户浏览器上的小文本文件,它包含有关用户的信息(如身份识别号码、密码、用户在Web站点上购物 的方式或用户访问该站点的次数)。

那么Cookie技术究竟怎样呢?是否真的给网络用户带来了个人隐私的危害呢?还是让我们看了下面的内容,再做回答吧。

(1)Cookie技术简介

在 WEB技术发展史上,Cookie技术的出现是一个重大的变革。最先是Netscape在它的Netscape Navigator 浏览器中引入了Cookie技术,从那时起,World Wide Web 协会就开始支持Cookie标准。以后又经过微软的大力推广(因为微软的IIS Web服务器所采用的ASP技术很大程度的使用了Cookier技术),即在微软的Internet Explorer浏览器中完全支持Cookie技术。到现在,绝大多数的浏览器都支持Cookie技术,或者至少兼容Cookie技术的使用。

1)什么是Cookie?

按 照Netscape官方文档中的定义,Cookie是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie是由Web服务器 保存在用户浏览器上的小广西文件,它可以包含有关用户的信息(如身份识别号码、密码、用户在Web站点购物的方式或用户访问该站点的次数)。无论何时用户 链接到服务器,Web站点都可以访问Cookie信息。

通俗地讲,浏览器用一个或多个限定的文件来支持Cookie。这些文件在使用 Windows操作系统的机器上叫做Cookie文件,在Macintosh机器上叫做magic Cookie 文件,这些文件被网站用来在上面存储Cookie数据。网站可以在这些Cookie文件中插入信息,这样对有些网络用户就有些副作用。有些用户认为这造成 了对个人隐私的侵犯,更糟的是,有些人认为Cookie是对个人空间的侵占,而且会对用户的计算机带来安全性的危害。

目前有些 Cookie是临时的,另一些则是持续的。临时的Cookie只在浏览器上保存一段规定的时间,一旦超过规定的时间该Cookie就会被系统清除。例如在 PHP中Cookie被用来跟踪用户进程直到用户离开网站。持续的Cookie则保存在用户的Cookie文件中,下一次用户返回时,仍然可以对它进行调 用。

在Cookie文件中保存Cookie,一些用户会过分地认为这将带来很大的问题。主要是有些用户担心Cookie会跟踪用户网上冲 浪的习惯,譬如用户喜爱到那些类型的站点、爱从事些什么活动等。害怕这种个人信息一旦落入一些别有用心的家伙手中,那么个人也就可能成为一大堆广告垃圾的 对象,甚至遭到意外的损害。不过,这种担心压根儿不会发生,因为网站以外的用户是无法跨过网站来获得Cookie信息的。所以想以这种目的来应用 Cookie是不可能的。不过,由于一些用户错误的理解以及“以讹传讹”,一些浏览器开发商别无选择,只好作出相识的响应(例如Netscape Navigator4.0和Internet Explorer3.0都提供了屏蔽Cookie的选项)。

对Cookie技术期待了这么 久的结果是,迫使许多浏览器开发商在它们的浏览器中提供了对Cookie的灵活性控制功能。例如,目前的两大主流浏览器Netscape Navigator 和 Internet Explorer是这样处理Cookie的:Netscape Navigator4.0不但可以接受Cookie进行警告,而且还可以屏蔽掉Cookie;InternetExplorer3.0也可以屏蔽 Cookie,但在Internet Explorer4.0中就只能进行接受警告而没有提供屏蔽选项,不过在Internet Explorer4.0之后的更新版本中又加入了屏蔽Cookie的功能选项。

此外,很多最新的技术甚至已经可以在不能屏蔽Cookie 的浏览器上进行Cookie的屏蔽了。例如,可以通过将Cookie文件设置成不同的类型来限制Cookie的使用。但是,非常不幸地是,要是你想完全屏 蔽Cookie的话,肯定会因此拒绝许多的站点页面。因为当今已经有许多Web站点开发人员爱上了Cookie技术的强大功能,例如Session对象的 使用就离不开Cookie的支持。

尽管今天仍有一些网络用户对于Cookie的争论乐此不倦,但是对于绝大多数的网络用户来说还是倾向于接受Cookie的。因此,我们尽可以放心地使用Cookie技术来开发我们的WEB页面。

2)Cookie是怎样工作的?

要 了解Cookie,必不可少地要知道它的工作原理。一般来说,Cookie通过HTTP Headers从服务器端返回到浏览器上。首先,服务器端在响应中利用Set-Cookie header来创建一个Cookie,然后,浏览器在它的请求中通过Cookie header包含这个已经创建的Cookie,并且反它返回至服务器,从而完成浏览器的论证。

例如,我们创建了一个名字为login的 Cookie来包含访问者的信息,创建Cookie时,服务器端的Header如下面所示,这里假设访问者的注册名是“Michael Jordan”,同时还对所创建的Cookie的属性如path、domain、expires等进行了指定。

Set-Cookie:login=Michael Jordan;path=/;domain=msn.com;
expires=Monday,01-Mar-99 00:00:01 GMT

上面这个Header会自动在浏览器端计算机的Cookie文件中添加一条记录。浏览器将变量名为“login”的Cookie赋值为“Michael Jordon”。注意,在实际传递过程中这个Cookie的值是经过了URLEncode方法的URL编码操作的。
这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器将Cookie通过请求以忽略路径的方式返回到服务器,完成浏览器的认证操作。

此 外,我们使用了Cookie的一些属性来限定该Cookie的使用。例如Domain属性能够在浏览器端对Cookie发送进行限定,具体到上面的例子, 该Cookie只能传达室到指定的服务器上,而决不会跑到其他的如www.hp.com的Web站点上去。Expires属性则指定了该Cookie保存 的时间期限,例如上面的Cookie在浏览器上只保存到1999年3月1日1秒。当然,如果浏览器上Cookie太多,超过了系统所允许的范围,浏览器将 自动对它进行删除。至于属性Path,用来指定Cookie将被发送到服务器的哪一个目录路径下。

说明:浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而且浏览器会这样一直发送,直到Cookie过期为止。

php

Cookie及其使用(二)

Tags: ,

上一部分讲了有关Cookie的技术背景,这部分来说说在PHP里如何设置、使用、删除Cookie,及Cookie的一些限制。PHP对Cookie支持是透明的,用起来非常方便。

1、设置Cookie

PHP用SetCookie函数来设置Cookie。必须注意的一点是:Cookie是HTTP协议头的一部分,用于浏览器和服务器之间传递信息,所以必须在任何属于HTML文件本身的内容输出之前调用Cookie函数。
SetCookie函数定义了一个Cookie,并且把它附加在HTTP头的后面,SetCookie函数的原型如下:
int SetCookie(string name, string value, int expire, string path, string domain, int secure);
除 了name之外所有的参数都是可选的。value,path,domain三个参数可以用空字符串代换,表示没有设置;expire 和 secure两个参数是数值型的,可以用0表示。expire参数是一个标准的Unix时间标记,可以用time()或mktime()函数取得,以秒为 单位。secure参数表示这个Cookie是否通过加密的HTTPS协议在网络上传输。
当前设置的Cookie不是立即生效的,而是要等到下一个页面时才能看到.这是由于在设置的这个页面里Cookie由服务器传递给客户浏览器,在下一个页面浏览器才能把Cookie从客户的机器里取出传回服务器的原因。
在同一个页面设置Cookie,实际是从后往前,所以如果要在插入一个新的Cookie之前删掉一个,你必须先写插入的语句,再写删除的语句,否则可能会出现不希望的结果。
来看几个例子:
简单的:
SetCookie(”MyCookie”, “Value of MyCookie”);
带失效时间的:
SetCookie(”WithExpire”, “Expire in 1 hour”, time() 3600);//3600秒=1小时
什么都有的:
SetCookie(”FullCookie”, “Full cookie value”, time() 3600, “/forum”, “.phpuser.com”, 1);

这 里还有一点要说明的,比如你的站点有几个不同的目录,那么如果只用不带路径的Cookie的话,在一个目录下的页面里设的Cookie在另一个目录的页面 里是看不到的,也就是说,Cookie是面向路径的。实际上,即使没有指定路径,WEB服务器会自动传递当前的路径给浏览器的,指定路径会强制服务器使用 设置的路径。解决这个问题的办法是在调用SetCookie时加上路径和域名,域名的格式可以是“www.phpuser.com”,也可是 “.phpuser.com”。
SetCookie函数里表示value的部分,在传递时会自动被encode,也就是说,如果value的值是 “test value”在传递时就变成了“test value”,跟URL的方法一样。当然,对于程序来说这是透明的,因为在PHP接收Cookie的值时会自动将其decode。
如果要设置同名的多个Cookie,要用数组,方法是:
SetCookie(”CookieArray[]“, “Value 1″);
SetCookie(”CookieArray[]“, “Value 2″);

SetCookie(”CookieArray[0]“, “Value 1″);
SetCookie(”CookieArray[1]“, “Value 2″);

2、接收和处理Cookie

PHP对Cookie的接收和处理的支持非常好,是完全自动的,跟FORM变量的原则一样,特别简单。
比 如设置一个名为MyCookier的Cookie,PHP会自动从WEB服务器接收的HTTP头里把它分析出来,并形成一个与普通变量一样的变量,名 为$myCookie,这个变量的值就是Cookie的值。数组同样适用。另外一个办法是引用PHP的全局变量$HTTP_COOKIE_VARS数组。
分别举例如下:(假设这些都在以前的页面里设置过了,并且仍然有效)
echo $MyCookie;
echo $CookieArray[0];
echo count($CookieArray);
echo $HTTP_COOKIE_VARS["MyCookie"];
就这么简单。

3、删除Cookie

要删除一个已经存在的Cookie,有两个办法:
一是调用只带有name参数的SetCookie,那么名为这个name的Cookie将被从关系户机上删掉;另一个办法是设置Cookie的失效时间为time()或time()-1,那么这个Cookie在这个页面的浏览完之后就被删除了(其实是失效了)。
要注意的是,当一个Cookie被删除时,它的值在当前页在仍然有效的。

4、使用Cookie的限制

首先是必须在HTML文件的内容输出之前设置;
其 次不同的浏览器对Cookie的处理不一致辞,且有时会出现错误的结果。比如:MS IE SERVICE PACK 1不能正确处理带域名和路径的Cookie,Netscape Communicator 4.05和MS IE 3.0不能正确处理不带路径和时间的Cookie。至于MS IE 5 好象不能处理带域名、路径和时间的Cookie。这是我在设计本站的页面时发现的。
第三个限制是在客户端的。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB站点能设置的Cookie总数不能超过20个。

关于Cookie的话题,就说到这儿了。

(由于Cookie最初由Netscape定义的,所以附上Netscape公司关于Cookie的官方原始定义的网址:http://www.netscape.com/newsref/std/cookie_spec.html)