Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1293480
  • 博文数量: 315
  • 博客积分: 10397
  • 博客等级: 上将
  • 技术积分: 3731
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-07 21:21
文章分类

全部博文(315)

文章存档

2015年(10)

2014年(3)

2013年(2)

2012年(8)

2011年(8)

2010年(29)

2009年(59)

2008年(77)

2007年(119)

分类:

2008-02-28 17:46:24

Zend_Http_Cookie,正像其字面意义一样,是一个表示HTTP cookie的类。它提供了解析Http响应字符串,收集cookie,以及轻松访问他们属性的方法。它也可以检查cookie是否与一个特殊的假想相匹配,比如一个请求URL,失效时间,安全连接等等。

Zend_Http_CookieJar是一个对象通常被Zend_Http_Client用来保存一组Zend_Http_Cookie对象。意思就是如果Zend_Http_CookieJar是一个Zend_Http_Client对象的从属对象的话,所有客户端通过HTTP请求和响应的Cookie都将会保存到CookieJar对象中。那样的话,当客户端要发起另一个请求时,首先会从CookieJar对象中寻找所有Cookie是否匹配该请求。这些将会被自动的添加到请求包中。当你需要维持一个持久HTTP请求的用户session,并且需要自动发送Session IDcookie时,这将会是非常有用的功能。另外,Zend_Http_CookieJar对象可以被序列化,并且当需要时可以存储进$_SESSION中。

 

实例化Zend_Http_Cookie对象

可以有以下两种办法实例化:

1、  通过构造器,使用以下语法:

new Zend_Http_Cookie(

string $name, //Cookie名,比如:PHPSESSID-必须

string $value, //Cookie值-必须

string $domain,//Cookie域名-必须

[int $expires,//Cookie失效时间,象UNIX时间戳-可选,缺省为null。如果没设,cookie将会被认为是一个’session cookie’,且没有过期时间

[string $path, //Cookie路径-可选,缺省为‘/

[boolean $secure]]]);//布尔值,cookie是否仅能通过安全连接传送(HTTPS)-可选,缺省为FALSE

2、可以调用fromString()静态方法,在’Set-Cookie’HTTP 响应报头或’Cookie’HTTP 请求报头中表现为一个cookie字符串。如果这样,cookie的值就必须被编码。当cookie字符串没有包含一个域名部分,你必须依照将被设定的cookie域名和路径提供一个相关URI

 

// First, using the constructor. This cookie will expire in 2 hours
$cookie = new Zend_Http_Cookie('foo''bar''.example.com'time() + 7200'/path'
);

// You can also take the HTTP response Set-Cookie header and use it.
// This cookie is similar to the previous one, only it will not expire, and
// will only be sent over secure connections
$cookie Zend_Http_Cookie::fromString('foo=bar; domain=.example.com; path=/path; secure'
);

// If the cookie's domain is not set, you have to manually specify it
$cookie Zend_Http_Cookie::fromString('foo=bar; secure;''');

 

注意:当使用Zend_Http_Cookie::fromString()实例化一个cookie对象的时候,cookie的值可能会被URL编码了,正如cookie字符串应该编码那样。然而,当使用构造器的时候,cookie的值是明码。

 

一个cookie对象可以被传回进一个字符串,使用__toString魔术变量。该方法将产生一个HTTP请求的Cookie报头字符串,显示的是cookie的名称和键值对,并且以一个分号结束。键值将会被URL编码,正如Cookie报头所期望的那样。

 

// Create a new cookie
$cookie = new Zend_Http_Cookie('foo''two words''.example.com'time() + 7200'/path'false);
// Will print out 'foo=two+words;' :
echo $cookie->__toString();
// This is actually the same:
echo (string) $cookie;
// In PHP 5.2 and higher, this also works:
echo $cookie;
 

Zend_Http_Cookie获取方法

一旦Zend_Http_Cookie被实例化,它提供了几个获取方法来取得HTTP cookie的不同属性。

 string getName(): 获取名称

string getValue(): 获取真实的未编码的cookie  

string getDomain(): 获取cookie的域名

string getPath(): 获取cookie的路径,缺省为’/’’

int getExpiryTime(): 获取cookie失效时间,是一个UNIX时间戳,如果未设,返回null

另外也提供了几个布尔测试方法:

boolean isSecure(): 检查是否通过安全HTTP连接

boolean isExpired(int $time = null): 检查是否失效。如果没失效返回true,如果$time有设定,将以当前时间为时间戳重新检查cookie.

boolean isSessionCookie(): 检查是否为session cookie-这是一个没有失效时间的cookie,会话结束,cookie就失效

 

// First, create the cookie
$cookie Zend_Http_Cookie::fromString('foo=two+words; domain=.example.com; path=/somedir; secure; expires=Wednesday, 28-Feb-05 20:41:22 UTC');

echo 
$cookie->getName();   // Will echo 'foo'
echo $cookie->getValue();  // will echo 'two words'
echo $cookie->getDomain(); // Will echo '.example.com'
echo $cookie->getPath();   // Will echo '/'

echo date('Y-m-d'$cookie->getExpiryTime());
// Will echo '2005-02-28'

echo ($cookie->isExpired() ? 'Yes' 'No');
// Will echo 'Yes'

echo ($cookie->isExpired(strtotime('2005-01-01') ? 'Yes' 'No');
// Will echo 'No'

echo ($cookie->isSessionCookie() ? 'Yes' 'No');
// Will echo 'No'
 

Zend_Http_Cookie:匹配一个假想

唯一存在于Zend_Http_Cookie中的使用逻辑是match方法。这个方法被用来测试一个cookie和一个给定的HTTP请求假想,以便知道cookie是否应该被发送。该方法有如下语法和参数

boolean Zend_Http_Cookie->match(mixed $uri, [boolean $matchSessionCookies, [int $now]]);

mixed $uri: 一个Zend_Uri_Http对象用来检查域名和路径,可选

boolean $matchSessionCookies: session cookie是否应该被匹配,缺省为true,如果为false,没有失效时间的cookie将永远不匹配

int $now: UNIX时间戳的形式检查一个cookie是否失效,如未指定将缺省为当前时间

 

// Create the cookie object - first, a secure session cookie
$cookie Zend_Http_Cookie::fromString('foo=two+words; domain=.example.com; path=/somedir; secure;');

$cookie->match('');
// Will return true

$cookie->match('');
// Will return false, because the connection is not secure

$cookie->match('');
// Will return false, because the domain is wrong

$cookie->match('');
// Will return false, because the path is wrong

$cookie->match(''false);
// Will return false, because session cookies are not matched

$cookie->match('');
// Will return true

// Create another cookie object - now, not secure, with expiration time in two hours
$cookie Zend_Http_Cookie::fromString('foo=two+words; domain=' date(DATE_COOKIEtime() + 7200));

$cookie->match('');
// Will return true

$cookie->match('');
// Will return true - non secure cookies can go over secure connections as well!

$cookie->match('');
// Will return false, because the domain is wrong

$cookie->match(''truetime() + (3600));
// Will return false, because we added a time offset of +3 hours to current time
 

The Zend_Http_CookieJar类库:实例化

在大部分场合,不需要直接实例化Zend_Http_CookieJar。如果你想配属一个新的cookie jar到你的Zend_Http_Client对象的话,只要调用Zend_Http_Client->setCookieJar(),这样一个新的,空的cookie jar将配属于你的客户端,之后你可以使用Zend_Http_Client->getCookieJar().来获取你的cookie jar

如果你仍然想手动实例化一个CookieJar对象,你可以通过直接调用new Zend_Http_CookieJar()来实现。构造器方法不需要任何参数。另一个实例化CookieJar对象的方法是使用静态的Zend_Http_CookieJar::fromResponse(),这个方法需要两个参数:一个Zend_Http_Response对象,和一个相关URI-既可以是字符串,也可以是一个Zend_Uri_Http对象。该方法将返回一个新的Zend_Http_CookieJar()对象,且已经包含了HTTP响应报头传过来的cookie数组。关联的URI将被用来设定cookie的域名和路径,如果它们没有在Set-Cookie报头里面定义的话

 

添加Cookie到一个Zend_Http_CookieJar()对象

通常,配属于Zend_Http_Client对象的CookieJar对象自动的添加了HTTP响应报头里面的cookie。如果你想手动的添加cookie到你的jar里,有两个办法:

Zend_Http_CookieJar->addCookie($cookie[, $ref_uri]): 添加一个cookiejar中。$cookie既可以是 Zend_Http_Cookie对象也可以是字符串,如果是字符串,你同时还必须提供$ref_uri -这是相关URI ,既可以是字符串也可以是Zend_Uri_Http对象,可用来做cookie的缺省域名和路径

Zend_Http_CookieJar->addCookiesFromResponse($response, $ref_uri): 把所有在一个HTTP响应包里面的所有cookies添加进jar里。$response 须是有着Set-Cookie头的Zend_Http_Response 对象. $ref_uri 是请求的URI, 既可以是字符串也可以是Zend_Uri_Http对象。

Zend_Http_CookieJar对象中取回Cookie

和添加Cookie一样,通常也是不需要手动去获取cookie,你的Zend_Http_Client将自动的为你取得一个HTTP请求所需的cookie,不过,你还是可以使用三个方法去取得cookie

Zend_Http_CookieJar::COOKIE_OBJECT: 返回Zend_Http_Cookie 对象,如果不只一个cookie,将返回一个对象数组.

Zend_Http_CookieJar::COOKIE_STRING_ARRAY: "foo=bar"的格式返回cookie字符串,适合发送一个HTTP请求的Cookie报头。如果不只一个cookie,将返回一个数组的字符串

Zend_Http_CookieJar::COOKIE_STRING_CONCAT: 类似COOKIE_STRING_ARRAY, 但如果返回不只一个cookie, 该方法将组合所有的cookie到一个有分号分割的长字符串,并返回它.如果你想直接发送在一个HTTP请求cookie报头里面所有匹配的cookie 的话,将特别有用。.

不同的获取cookie的方法如下:

·  Zend_Http_CookieJar->getCookie($uri, $cookie_name[, $ret_as]):根据URI(域名和路径)cookie名称来获取一个cookie $uri既可以是字符串也可以是Zend_Uri_Http对象. $cookie_name 是一个标识为cookie name 的字符串. $ret_as 指定返回类型,缺省为COOKIE_OBJECT.

·  Zend_Http_CookieJar->getAllCookies($ret_as): 获取所有cookie. $ret_as指定返回类型. 如没指定 $ret_type缺省为COOKIE_OBJECT.

·  Zend_Http_CookieJar->getMatchingCookies($uri[, $matchSessionCookies[, $ret_as[, $now]]]): 获取所有匹配的cookie 也就是URI和失效时间

o    $uri 既可以是 Zend_Uri_Http 对象也可以是一个指定连接类型(安全或非安全连接),域名和路径来匹配的字符串

o    $matchSessionCookies 是一个布尔值表明是否匹配session cookie缺省为TRUE.

o    $ret_as 指明返回类型,缺省为COOKIE_OBJECT.

o    $now 是一个整数的UNIX时间戳。$now-也就是说任何设定失效时间在这个时间之前的cookie都将不做匹配,如没指定,缺省为当前时间

阅读(2706) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~