全部博文(315)
分类:
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 ID的cookie时,这将会是非常有用的功能。另外,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_COOKIE
,
time
() +
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
(
''
,
true
,
time
() + (
3
*
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])
: 添加一个cookie到jar中。$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都将不做匹配,如没指定,缺省为当前时间