Zend_Http_Cookie-Handling.xml 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 13910 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.http.cookies">
  5. <title>Zend_Http_Cookie and Zend_Http_CookieJar</title>
  6. <sect2 id="zend.http.cookies.introduction">
  7. <title>Introduction</title>
  8. <para><classname>Zend_Http_Cookie</classname>, comme son nom l'indique, est une classe qui représente un cookie HTTP. Elle
  9. propose des méthodes d'analyse de la chaîne de réponse HTTP, de collection des cookies, et d'accès à leurs
  10. propriétés. Il est aussi possible avec cette classe de vérifier si les paramètres d'un cookie correspondent à un
  11. scénario précis, par exemple une URL spécifique, un certain temps d'expiration, la présence ou non de HTTPS,
  12. etc...</para>
  13. <para><classname>Zend_Http_CookieJar</classname> est un objet utilisé en général avec <classname>Zend_Http_Client</classname> pour
  14. fournir une collection d'objets <classname>Zend_Http_Cookie</classname>. L'idée principale est d'attacher un objet
  15. <classname>Zend_Http_CookieJar</classname> à un objet <classname>Zend_Http_Client</classname>, de manière à ce que toutes les
  16. requêtes de celui-ci utilisent les cookies présents dans l'objet <code>CookieJar</code>. Ainsi, lorsque le
  17. client enverra une autre requête, il demandera à l'objet <code>CookieJar</code> tous les cookies concernant
  18. cette requête. Ceci est très pratique dans des cas comme envoyer un cookie de session entre plusieurs requêtes
  19. HTTP successives. De plus, l'objet <classname>Zend_Http_CookieJar</classname> peut être sérialisé et mis en
  20. session.</para>
  21. </sect2>
  22. <sect2 id="zend.http.cookies.cookie.instantiating">
  23. <title>Instancier des objets Zend_Http_Cookie</title>
  24. <para>L'instanciation se fait de deux manières différentes : <itemizedlist>
  25. <listitem>
  26. <para>Via son constructeur, de cette façon : <code>new Zend_Http_Cookie(string $name, string $value,
  27. string $domain, [int $expires, [string $path, [boolean $secure]]]);</code></para>
  28. <itemizedlist>
  29. <listitem>
  30. <para><code>$name</code>: Nom du cookie (par ex. "PHPSESSID") (requis)</para>
  31. </listitem>
  32. <listitem>
  33. <para><code>$value</code>: La valeur du cookie (requis)</para>
  34. </listitem>
  35. <listitem>
  36. <para><code>$domain</code>: Le domaine de validité du cookie (par ex. ".example.com")
  37. (requis)</para>
  38. </listitem>
  39. <listitem>
  40. <para><code>$expires</code>: Temps d'expiration du cookie, un timestamp UNIX (optionnel,
  41. défaut à <code>null</code>). Si non fourni, le cookie sera considéré comme "cookie de
  42. session", avec pas de temps d'expiration.</para>
  43. </listitem>
  44. <listitem>
  45. <para><code>$path</code>: Chemin de validité du cookie, par ex. "/foo/bar/" (optionnel,
  46. défaut : "/")</para>
  47. </listitem>
  48. <listitem>
  49. <para><code>$secure</code>: Booléen, Si le cookie doit être transmis via connexion sécurisée
  50. (HTTPS) uniquement (optionnel, défaut à <code>FALSE</code>)</para>
  51. </listitem>
  52. </itemizedlist>
  53. </listitem>
  54. <listitem>
  55. <para>En appelant la méthode statique <code>fromString()</code>, avec une chaîne de caractères
  56. représentant un cookie tel que défini dans les en-têtes HTTP "Set-Cookie" (réponse) ou "Cookie"
  57. (requête). Dans ce cas la valeur du cookie doit être encodée. Lorsque la chaîne de caractères
  58. représentant un cookie ne comporte pas de partie "domain", vous devez fournir alors un URI selon
  59. lequel le cookie cherchera son domaine et son chemin.</para>
  60. </listitem>
  61. </itemizedlist> <example id="zend.http.cookies.cookie.instantiating.example-1">
  62. <title>Créer un objet Zend_Http_Cookie</title>
  63. <programlisting role="php"><![CDATA[
  64. // D'abord, en utilisant son constructeur.
  65. // ce cookie expirera dans 2 heures
  66. $cookie = new Zend_Http_Cookie('foo',
  67. 'bar',
  68. '.example.com',
  69. time() + 7200,
  70. '/path');
  71. // En prenant l'en-tête de réponse HTTP 'Set-Cookie'
  72. // Ce cookie n'expirera pas et ne sera envoyé que
  73. // sur des connexions sécurisées
  74. $cookie = Zend_Http_Cookie::fromString(
  75. 'foo=bar; domain=.example.com; path=/path; secure');
  76. // Si le domaine n'est pas présent, spécifiez le manuellement :
  77. $cookie = Zend_Http_Cookie::fromString(
  78. 'foo=bar; secure;', 'http://www.example.com/path');
  79. ]]></programlisting>
  80. </example> <note>
  81. <para>Lorsque vous utilisez la méthode statique <classname>Zend_Http_Cookie::fromString()</classname>, veillez à
  82. fournir un cookie URL encodé (tel que c'est le cas dans les en-têtes HTTP). Avec le constructeur en
  83. revanche, il est nécessaire d'utiliser une valeur non encodée.</para>
  84. </note></para>
  85. <para>La manipulation inverse est possible. Grâce à la méthode <code>__toString()</code>, vous pouvez récupérer
  86. une chaîne représentant le cookie, à partir de l'objet <classname>Zend_Http_Cookie</classname>. La chaîne alors retournée
  87. est la même que celle utilisée dans l'en-tête HTTP "Cookie", à savoir une chaîne encodée, terminée par un
  88. point-virgule (;) : <example id="zend.http.cookies.cookie.instantiating.example-2">
  89. <title>Passer de l'objet Zend_Http_Cookie à la chaîne</title>
  90. <programlisting role="php"><![CDATA[
  91. // Création d'un nouveau cookie
  92. $cookie = new Zend_Http_Cookie('foo',
  93. 'two words',
  94. '.example.com',
  95. time() + 7200,
  96. '/path');
  97. // Va afficher 'foo=two+words;' :
  98. echo $cookie->__toString();
  99. // Ceci est la même chose
  100. echo (string) $cookie;
  101. // En PHP 5.2 et plus, ceci fonctionne aussi :
  102. echo $cookie;
  103. ]]></programlisting>
  104. </example></para>
  105. </sect2>
  106. <sect2 id="zend.http.cookies.cookie.accessors">
  107. <title>Zend_Http_Cookie méthodes getter</title>
  108. <para>Une fois l'objet <classname>Zend_Http_Cookie</classname> crée, il existe des méthodes 'getter' pour accéder aux
  109. différentes propriétés du cookie : <itemizedlist>
  110. <listitem>
  111. <para><code>string getName()</code>: Retourne le nom du cookie</para>
  112. </listitem>
  113. <listitem>
  114. <para><code>string getValue()</code>: Retourne la valeur réelle (décodée), du cookie</para>
  115. </listitem>
  116. <listitem>
  117. <para><code>string getDomain()</code>: Retourne le domaine du cookie</para>
  118. </listitem>
  119. <listitem>
  120. <para><code>string getPath()</code>: Retourne le chemin du cookie, par défaut '/'</para>
  121. </listitem>
  122. <listitem>
  123. <para><code>int getExpiryTime()</code>: Retourne la date d'expiration, comme timestamp UNIX. Si pas
  124. de date, <code>NULL</code> sera retourné.</para>
  125. </listitem>
  126. </itemizedlist></para>
  127. <para>Voici encore quelques méthodes de vérifications booléennes : <itemizedlist>
  128. <listitem>
  129. <para><code>boolean isSecure()</code>: Regarde si le cookie est un cookie sécurisé. Si c'est le cas,
  130. les navigateurs ont pour instruction de ne les envoyer que sur des connexions sécurisées
  131. (HTTPS).</para>
  132. </listitem>
  133. <listitem>
  134. <para><code>boolean isExpired(int $time = null)</code>: Vérifie si le cookie est expirés. Si il n'y
  135. a pas de date d'expiration, cette méthode retournera toujours <code>true</code>. Si
  136. <code>$time</code> est fourni, alors la date du cookie sera comparée à ce <code>$time</code>, et non
  137. plus au temps actuel.</para>
  138. </listitem>
  139. <listitem>
  140. <para><code>boolean isSessionCookie()</code>: Vérifie si le cookie est un cookie dit 'de session'.
  141. C'est un cookie sans date d'expiration, sensé être détruit à la fin de la session de travail
  142. actuelle (à la fermeture du navigateur).</para>
  143. </listitem>
  144. </itemizedlist></para>
  145. <para><example id="zend.http.cookies.cookie.accessors.example-1">
  146. <title>Utilisation des méthodes getter de Zend_Http_Cookie</title>
  147. <programlisting role="php"><![CDATA[
  148. // Création d'un cookie
  149. $cookie =
  150. Zend_Http_Cookie::fromString('foo=two+words;'
  151. . ' domain=.example.com;'
  152. . ' path=/somedir;'
  153. . 'secure;'
  154. . 'expires=Wednesday, 28-Feb-05 20:41:22 UTC');
  155. echo $cookie->getName(); // Affiche 'foo'
  156. echo $cookie->getValue(); // Affiche 'two words'
  157. echo $cookie->getDomain(); // Affiche '.example.com'
  158. echo $cookie->getPath(); // Affiche '/'
  159. echo date('Y-m-d', $cookie->getExpiryTime());
  160. // Affiche '2005-02-28'
  161. echo ($cookie->isExpired() ? 'Yes' : 'No');
  162. // Affiche 'Yes'
  163. echo ($cookie->isExpired(strtotime('2005-01-01') ? 'Yes' : 'No');
  164. // Affiche 'No'
  165. echo ($cookie->isSessionCookie() ? 'Yes' : 'No');
  166. // Affiche 'No'
  167. ]]></programlisting>
  168. </example></para>
  169. </sect2>
  170. <sect2 id="zend.http.cookies.cookie.matching">
  171. <title>Zend_Http_Cookie: Correspondance de scénario</title>
  172. <para>La vraie valeur ajoutée d'un objet <classname>Zend_Http_Cookie</classname> est sa méthode match(). Celle-ci teste le
  173. cookie en rapport avec un scénario HTTP, pour savoir ci celui-ci doit être attaché à la requête ou pas. La
  174. syntaxe est la suivante : <code>boolean Zend_Http_Cookie-&gt;match(mixed $uri, [boolean $matchSessionCookies,
  175. [int $now]]);</code> <itemizedlist>
  176. <listitem>
  177. <para><code>mixed $uri</code> : un objet Zend_Uri_Http avec un domaine et un chemin à vérifier. Une
  178. chaîne représentant une URL peut aussi être utilisée. Le cookie sera déclaré bon si le schéma de
  179. l'URL (HTTP ou HTTPS) correspond, ainsi que le chemin (path).</para>
  180. </listitem>
  181. <listitem>
  182. <para><code>boolean $matchSessionCookies</code> : établit ou non une correspondance pour les cookies
  183. dits de session. Par défaut : <code>true</code>. Si mis à <code>false</code>, alors les cookies sans
  184. date d'expiration seront ignorés du processus.</para>
  185. </listitem>
  186. <listitem>
  187. <para><code>int $now</code> : timestamp UNIX passé pour vérifier l'expiration du cookie. Si non
  188. spécifié, alors le temps actuel sera pris en considération.</para>
  189. </listitem>
  190. </itemizedlist> <example id="zend.http.cookies.cookie.matching.example-1">
  191. <title>Correspondance de cookies</title>
  192. <programlisting role="php"><![CDATA[
  193. // Création de l'objet cookie - d'abord un cookie sécurisé
  194. $cookie = Zend_Http_Cookie::fromString(
  195. 'foo=two+words; domain=.example.com; path=/somedir; secure;');
  196. $cookie->match('https://www.example.com/somedir/foo.php');
  197. // Retournera true
  198. $cookie->match('http://www.example.com/somedir/foo.php');
  199. // Retournera false, car la connexion n'est pas sécurisée
  200. $cookie->match('https://otherexample.com/somedir/foo.php');
  201. // Retournera false, le domaine est incorrect
  202. $cookie->match('https://example.com/foo.php');
  203. // Retournera false, le chemin est incorrect
  204. $cookie->match('https://www.example.com/somedir/foo.php', false);
  205. // Retournera false, car les cookies de session ne sont pas pris en compte
  206. $cookie->match('https://sub.domain.example.com/somedir/otherdir/foo.php');
  207. // Retournera true
  208. // Création d'un autre objet cookie - cette fois non sécurisé,
  209. // expire dans 2 heures
  210. $cookie = Zend_Http_Cookie::fromString(
  211. 'foo=two+words; domain=www.example.com; expires='
  212. . date(DATE_COOKIE, time() + 7200));
  213. $cookie->match('http://www.example.com/');
  214. // Retournera true
  215. $cookie->match('https://www.example.com/');
  216. // Will return true - non secure cookies can go
  217. // over secure connexions as well!
  218. $cookie->match('http://subdomain.example.com/');
  219. // Retournera false, domaine incorrect
  220. $cookie->match('http://www.example.com/', true, time() + (3 * 3600));
  221. // Retournera false, car nous avons rajouter 3 heures au temps actuel
  222. ]]></programlisting>
  223. </example></para>
  224. </sect2>
  225. <sect2 id="zend.http.cookies.cookiejar">
  226. <title>Classe Zend_Http_CookieJar : Instanciation</title>
  227. <para>Dans la plupart des cas, il ne sera pas nécessaire d'instancier soi-même un objet
  228. <classname>Zend_Http_CookieJar</classname>. Si vous voulez un conteneur de cookie (CookieJar) attaché à votre objet
  229. <classname>Zend_Http_Client</classname>, appelez simplement <classname>Zend_Http_Client-&gt;setCookieJar()</classname>, et un
  230. nouveau conteneur, vide, y sera attaché. Plus tard, vous pourrez utiliser la méthode
  231. <classname>Zend_Http_Client-&gt;getCookieJar()</classname>, pour récupérer ce conteneur.</para>
  232. <para>Si vous voulez tout de même instancier manuellement un objet <code>CookieJar</code>, appelez son
  233. constructeur avec "<code>new Zend_Http_CookieJar()</code>", sans paramètres. Sinon il est possible aussi de
  234. passer par la méthode statique <classname>Zend_Http_CookieJar::fromResponse()</classname> qui prend, elle, deux paramètres
  235. : un objet <classname>Zend_Http_Response</classname> et un URI de référence (un objet <classname>Zend_Uri_Http</classname> ou une
  236. chaîne). Cette méthode retourne alors un objet <classname>Zend_Http_CookieJar</classname> qui contiendra les cookies de la
  237. réponse HTTP passée. L'URI de référence servira à remplir les paramètres "domain" et "path" des cookies, si
  238. jamais ils n'ont pas été définis dans les en-têtes "Set-Cookie".</para>
  239. </sect2>
  240. <sect2 id="zend.http.cookies.cookiejar.adding_cookies">
  241. <title>Ajouter des cookies à un objet Zend_Http_CookieJar</title>
  242. <para>En temps normal, c'est l'objet <classname>Zend_Http_Client</classname> qui ajoutera des cookies dans l'objet
  243. <code>CookieJar</code> que vous lui aurez attaché. Vous pouvez en ajouter manuellement aussi : <itemizedlist>
  244. <listitem>
  245. <para><classname>Zend_Http_CookieJar-&gt;addCookie($cookie[, $ref_uri])</classname>: Ajoute un cookie au
  246. conteneur (Jar). $cookie peut être soit un objet <classname>Zend_Http_Cookie</classname>, soit une chaîne qui
  247. sera alors convertie de manière automatique en objet cookie. Si vous passez une chaîne, alors vous
  248. devriez aussi passer le paramètre $ref_uri qui représente l'URI de référence pour déterminer les
  249. paramètres "domain" et "path" du cookie.</para>
  250. </listitem>
  251. <listitem>
  252. <para><classname>Zend_Http_CookieJar-&gt;addCookiesFromResponse($response, $ref_uri)</classname>: Ajoute tous
  253. les cookies présents dans une réponse HTTP au conteneur. La réponse HTTP doit être un objet
  254. <classname>Zend_Http_Response</classname> contenant au moins un en-tête "Set-Cookie".
  255. <classname>$ref_uri</classname> est un URI (un objet Zend_Uri_Http ou une chaîne), servant de
  256. référence pour remplir les paramètres du cookie "domain" et "path", si ceux-ci ne sont pas trouvés
  257. dans la réponse.</para>
  258. </listitem>
  259. </itemizedlist></para>
  260. </sect2>
  261. <sect2 id="zend.http.cookies.cookiejar.getting_cookies">
  262. <title>Récupérer les cookies présents dans un objet Zend_Http_CookieJar</title>
  263. <para>Comme pour l'ajout de cookies, en théorie, vous n'aurez pas besoin de récupérer des cookies du conteneur,
  264. car l'objet <classname>Zend_Http_Client</classname> se chargera de les gérer lui-même et de les envoyer dans les bonnes
  265. requêtes. Cependant, il existe des méthodes pour récupérer des cookies depuis un conteneur (Jar) :
  266. <code>getCookie()</code>, <code>getAllCookies()</code>, et <code>getMatchingCookies()</code>. De plus, itérer
  267. sur le CookieJar vous permettra d'en extraire tous les objets <classname>Zend_Http_Cookie</classname>.</para>
  268. <para>Il est important de noter que chacune de ces trois méthodes, prend un paramètre spécial destiné à
  269. déterminer le type que chaque méthode retournera. Ce paramètre peut avoir 3 valeurs: <itemizedlist>
  270. <listitem>
  271. <para><classname>Zend_Http_CookieJar::COOKIE_OBJECT</classname>: Retourne un objet
  272. <classname>Zend_Http_Cookie</classname>. Si plus d'un cookie devait être retourné, il s'agira alors d'un
  273. tableau d'objets cookie.</para>
  274. </listitem>
  275. <listitem>
  276. <para><classname>Zend_Http_CookieJar::COOKIE_STRING_ARRAY</classname>: Retourne les cookies comme des chaînes
  277. de caractères dans un format "foo=bar", correspondant au format de l'en-tête de requête HTTP
  278. "Cookie". Si plus d'un cookie devait être retourné, il s'agira alors d'un tableau de chaînes.</para>
  279. </listitem>
  280. <listitem>
  281. <para><classname>Zend_Http_CookieJar::COOKIE_STRING_CONCAT</classname>: Similaire à COOKIE_STRING_ARRAY, mais
  282. si plusieurs cookies devaient être retournés, alors il ne s'agira plus d'un tableau, mais d'une
  283. chaîne concaténant tous les cookies, séparés par des point-virgule (;). Ceci est très utile pour
  284. passer tous les cookies d'un coup, dans l'en-tête HTTP "Cookie".</para>
  285. </listitem>
  286. </itemizedlist></para>
  287. <para>Voici la structure des méthodes de récupération des cookies : <itemizedlist>
  288. <listitem>
  289. <para><classname>Zend_Http_CookieJar-&gt;getCookie($uri, $cookie_name[, $ret_as])</classname>: Retourne un
  290. cookie depuis le conteneur, selon son URI (domain et path), et son nom. <code>$uri</code> est un
  291. objet <classname>Zend_Uri_Http</classname> ou une chaîne. $cookie_name est une chaîne identifiant le cookie en
  292. question. $ret_as spécifie le type de retour, comme vu plus haut (par défaut COOKIE_OBJECT).</para>
  293. </listitem>
  294. <listitem>
  295. <para><classname>Zend_Http_CookieJar-&gt;getAllCookies($ret_as)</classname>: Retourne tous les cookies du
  296. conteneur. $ret_as spécifie le type de retour, comme vu plus haut (par défaut COOKIE_OBJECT).</para>
  297. </listitem>
  298. <listitem>
  299. <para><classname>Zend_Http_CookieJar-&gt;getMatchingCookies($uri[, $matchSessionCookies[, $ret_as[,
  300. $now]]])</classname>: Retourne tous les cookies ayant une correspondance pour un scénario donné, à savoir
  301. un URI et une date d'expiration. <itemizedlist>
  302. <listitem>
  303. <para><code>$uri</code> est soit un objet Zend_Uri_Http soit une chaîne.</para>
  304. </listitem>
  305. <listitem>
  306. <para><code>$matchSessionCookies</code> est un booléen désignant si les cookies de
  307. session, c'est à dire sans date d'expiration, doivent être analysés aussi pour établir
  308. une correspondance. Par défaut : <code>true</code>.</para>
  309. </listitem>
  310. <listitem>
  311. <para><code>$ret_as</code> spécifie le type de retour, comme vu plus haut (par défaut
  312. COOKIE_OBJECT).</para>
  313. </listitem>
  314. <listitem>
  315. <para><code>$now</code> est un entier représentant un timestamp UNIX à considérer comme
  316. 'maintenant'. Ainsi tous les cookies expirant avant ce temps là, ne seront pas pris en
  317. compte. Si vous ne spécifiez pas ce paramètre, alors c'est le temps actuel qui sera pris
  318. comme référence.</para>
  319. </listitem>
  320. </itemizedlist> Vous pouvez en apprendre plus sur la correspondance des cookies ici : <xref
  321. linkend="zend.http.cookies.cookie.matching" />.</para>
  322. </listitem>
  323. </itemizedlist></para>
  324. </sect2>
  325. </sect1>