`

使用Cookie和用户会话

阅读更多

使用 Cookie 和用户会话

PHP 包含了很多的函数,可以用来管理和记录用户信息,包括简单的 cookie 和全方位的用户会话。会话使用 PHP 语言内建的技术,使得保存状态就像是引用超全局变量那样简单。

1. Cookie 简介

我们可以和 PHP 脚本一起使用 cookie 来存储一些关于用户的较小的信息。 Cookie 是由用户浏览器存储的少量数据,它和一个来自服务器或脚本的请求一致。通过一个用户的浏览器,一个单个的主机可以请求保存 20 cookie 。每个 cookie 包含一个名字、值和过期日期,以及主机和路径信息。一个单个的 cookie 的大小限制是 4KB

在设置了 cookie 之后,只有发出请求的主机能够读取数据,这就保证了用户隐私得到尊重。另外,用户可以配置自己的浏览器通过他接受或是拒绝所有 cookie 的请求。因此, cookie 应该适度地使用,并且在没有设计实现警告用户的一个环境中,不应该作为一个基本元素而依赖。

如果 Web 浏览器配置为存储 cookie ,它将保持基于 cookie 的信息直到过期日期。如果用户使用浏览器浏览符合 cookie 的路径和域的任何页面,它将会把 cookie 重新发送给服务器。随后,一个 PHP 脚本能够访问 cookie cookie 在环境变量 HTTP_COOKIE 中或者作为 $COOKIE 超全局变量的一部分,我们可以用 3 种方式来访问它们:

echo $_SERVER[“HTTP_COOKIE”];

echo getenv(“HTTP_COOKIE”);

echo $_COOKIE[“vegetable”];

2. 使用 PHP 设置一个 cookie

我们可以用两种方法在一个 PHP 脚本中设置一个 cookie 。首先,用 header() 函数来设置 SetCookie 标头。 Header() 函数需要一个字符串,该字符串随后将包含到服务器响应的标头部分。由于标头会为你自动发送, header() 必须在发送给浏览器的热河输出之前调用。

head(“Set Cookie:vegetable=artichoke; expires=Tue,07-Mar-06 14:39:58 GMT;path=/;domain=yourmain.com”);

尽管没什么困难,这种设置 cookie 的方法还是需要我们编写一个函数来构建标头字符串。像这个例子那样格式化日期并对名 / 值对进行 URL 编码并不是特别艰难的任务,但它还是一项重复性的工作,因为 PHP 提供了一个函数来做到这些,这就是 setcookie()

Setcookie() 函数所做的事情就像它的名字所显示的那样,它输出一个 Set-Cookie 标头。因此,它应该在任何其他内容发送给浏览器之前调用。这个函数接受 cookie 名字、 cookie 值、 UNIX 时间戳格式的过期日期、路径、域,以及一个整数,如果 cookie 仅通过一个安全的连接发送的话,这个整数的值设置为 1. 除了第一个参数以外,这个函数的所有参数都是可选的。

<?php

setcookie ( "vegetable" , "artichoke" , time ()+3600, "/" , ".yourdomain.com" , 0);

if ( isset ( $_COOKIE [ "vegetable" ])){

echo "<p>Hello again, you have chosen: " . $_COOKIE [ "vegetable" ]. ".</p>" ;

}

else {

echo "<p>Hello you. This may be your first visit.</p>" ;

}

?>

即便我们在脚本第一次运行的时候设置 cookie $_COOKIE[“vegetable”] 变量也不会在这时候创建。由于只有当浏览器将一个 cookie 发送到服务器的时候,才会读取它,因此,直到用户重新访问这个域内的一个页面的时候,我们才能够读取它。

正式地讲,要删除一个 cookie ,只需要调用带有 cookie 名字参数的 setcookies():

setcookie(“vegetable”);

然而,这种方法并不总是奏效,并且不能依赖这种方法。相反,要删除一个 cookie ,使用一个确定已经过期的时间来设置 cookie ,这种方法是最安全的:

Setcookie(“vegetable”, “”, time()-60, “/”, “yourdomain.com”, 0);

还要确保传递给 setcookie() 与最初设置 cookie 时候所使用的是相同的路径、域和安全参数。

3. 会话函数概览

当一个访客访问一个支持会话的页面,要么分配一个新的标识符,要么这个用户和之前的访问已经建立的一个标识符重新关联。任何已经和会话相关联的变量,都通过 $_SESSION 超全局变量可供你的代码使用。

会话状态通常存储在一个临时文件中,尽管你可以使用一个名为 session_set_save_handler() 的函数实现数据库存储。

4. 开始一个会话

<?php

session_start ();

echo "<p>Your session ID is " . session_id (). "</p>" ;

?>

5. 使用会话变量

在每一个 PHP 文档中访问一个唯一的会话标识符只是会话功能的开始。当一个会话启动后,我们可以在超全局变量 $_SESSION 中存储任意多个变量,然后在任何支持会话的页面上访问它们。

下面程序向超全局变量 $_SESSION 添加了两个变量:

<?php

session_start ();

$_SESSION [ "product1" ] = "Sonic Screwdriver" ;

$_SESSION [ "product2" ] = "HAL 2000" ;

echo "The products have been registered." ;

?>

在用户移动到一个新的页面之前,上面程序的神奇之处不会体现出来。下面的程序创建了一个单独的 PHP 脚本,这个脚本访问存储在超全局变量 $_SESSION 中的变量。

<?php

session_start ();

echo "Your chosen products are:" ;

echo "<ul>" ;

echo "<li>" . $_SESSION [ "product1" ]. "</li>" ;

echo "<li>" . $_SESSION [ "product2" ]. "</li>" ;

echo "</ul>" ;

?>

下列程序清单创建一个表单,它允许一个用户来选择多个产品。我们可以使用会话变量来创建一个基本的购物车。

//arraysession.php

<?php

session_start ();

?>

<html>

<head>

<title> Storing an array with a session </title>

</head>

<body>

<h1> Product Choice Page </h1>

<?php

if ( isset ( $_POST [ "form_products" ])){

if (! empty ( $_SESSION [ "products" ])){

$products = array_unique (

array_merge ( unserialize ( $_SESSION [ "products" ]),

$_POST [ "form_produces" ]));

}

else

{

$_SESSION [ "products" ] = serialize ( $_POST [ "form_products" ]);

}

echo "<p>Your products have been registered!</p>" ;

}

?>

<form method = "POST" action = " <?php echo $_SERVER [ "PHP_SELF" ]; ?> " >

<p><strong> Select some products: </strong><br>

<select name = "form_product[]" multiple = "multiple" size = "3" >

<option value = "Sonic Screwdriver" > Sonic Screwdriver </option>

<option value = "Hal 2000" > Hal 2000 </option>

<option value = "Tardis" > Tardis </option>

<option value = "ORAC" > ORAC </option>

<option value = "Transporter bracelet" > Transporter bracelet </option>

</select>

<p><input type = "submit" value = "choose" /></p>

</form>

<p><a href = "session1.php" > go to content page </a></p>

</body>

</html>

//session1.php

<?php

/*

* Created on 2011-1-19

*

* To change the template for this generated file go to

* Window - Preferences - PHPeclipse - PHP - Code Templates

*/

session_start ();

?>

<html>

<head>

<title> Accessing session variables </title>

</head>

<body>

<h1> Content Page </h1>

<?php

if ( isset ( $_SESSION [ "products" ])){

echo "<strong>Your cart:</strong><ol>" ;

foreach ( unserialize ( $_SESSION [ "products" ]) as $p ){

echo "<li>" . $p . "</li>" ;

}

echo "</ol>" ;

}

?>

<p><a href = "arraysession.php" > return to product choice page </a></p>

</body>

</html>

6. 在查询字符串中传递会话 ID

7. 销毁会话和重置变量

8. 在一个带有注册用户的环境中使用会话

<!-- [if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:AllowPNG/> </o:OfficeDocumentSettings> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:EnableOpenTypeKerning/> <w:DontFlipMirrorIndents/> <w:OverrideTableStyleHps/> <w:UseFELayout/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="&#45;-"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" Priority="39" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" Name="toc 9"/> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/> <w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/> <w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/> <w:LsdException Loc
分享到:
评论

相关推荐

    练习2:使用Cookie简化用户登录.zip

    在Web开发中,用户登录是常见的功能之一,而使用Cookie技术可以有效地简化这一过程,提供更流畅的用户体验。本练习将探讨如何利用Cookie来管理用户的登录状态,从而避免频繁地发送登录请求。以下是对这个主题的详细...

    使用Cookie进行会话管理.docx

    在IT行业中,特别是JavaWeb开发领域,会话管理是一个至关重要的环节,因为它涉及到用户与服务器交互过程中的数据持久化和用户身份验证。...合理使用Cookie和Session,可以有效地提高网站的用户体验和安全性。

    PHP 会话控制 cookie 基础教程

    然而,鉴于 Cookie 的使用涉及到用户隐私和安全问题,开发者在使用 Cookie 时需要格外谨慎。正确的使用 Cookie 能够增强网站的功能性和安全性,而错误的使用则可能导致数据泄露和其他安全风险。因此,在开发过程中...

    分布式架构下的会话追踪实践【基于Cookie和Redis实现】

    本实践将探讨如何在分布式环境中实现会话追踪,主要采用Cookie和Redis这两种技术手段。 首先,我们要理解会话(Session)的概念。在Web开发中,会话是一种在用户浏览器与服务器之间维持状态的技术,允许跨多个HTTP...

    cookie 会话的操作

    在IT领域,尤其是在Web开发中,Cookie和会话管理是至关重要的概念,它们涉及到用户身份验证、状态跟踪以及用户体验优化等多个方面。以下是对"Cookie会话的操作"这一主题的详细阐述。 Cookie是一种在客户端(用户的...

    用户登录功能(cookie实现)

    10. **会话管理**:除了Cookie,ASP.NET还提供了Session状态管理,可以在服务器端存储用户会话信息。然而,Cookie在跨域共享和客户端控制方面更灵活。开发者通常结合Cookie和Session来提供更完善的用户管理。 以上...

    用户登录,会话跟踪

    1. **Cookie**:Cookie是服务器发送到用户浏览器并存储在本地的一小块数据,它包含了与用户会话相关的信息。当用户再次向服务器发送请求时,浏览器会自动将该Cookie一起发送,服务器通过解析Cookie来识别用户。...

    使用Cookie记录用户名和密码

    标题“使用Cookie记录用户名和密码”涉及到的是Web开发中的用户会话管理技术,特别是关于Cookie的应用。Cookie是一种在客户端和服务器之间传递信息的小型文本文件,常用于保持用户登录状态、存储用户偏好设置等。在...

    cookie和会话状态的工作原理 .docx

    Cookie和会话状态是Web开发中的重要概念,用于在客户端和服务器之间保持状态。本文将深入探讨这两种技术的工作原理。...正确使用Cookie和Session可以帮助开发者提供个性化的用户体验,同时确保数据的安全。

    Python-pycookiecheat从浏览器的已验证会话中获取Cookie以便在Python脚本中使用

    `pycookiecheat`是一个方便的Python库,它允许我们从已经验证的浏览器会话中提取Cookie,然后在Python脚本中使用这些Cookie来模拟登录状态。 首先,让我们深入了解一下什么是Cookie。Cookie是服务器发送到用户...

    Cookie和Session会话技术笔记

    会话技术简单介绍,会话可以简单的理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。会话过程中要解决的一些问题?每个用户与服务器进行交互的过程中,...

    cookie-session, 基于简单cookie的会话中间件.zip

    cookie-session, 基于简单cookie的会话中间件 cookie会话 基于简单...用户会话可以通过 Cookies 以两种主要方式存储: 在服务器上或者在客户端上。 这个模块在cookie中存储会话数据,而像 express会话的模块在cook

    用户会话完整性的保持

    【用户会话完整性的保持】 在信息技术领域,用户会话完整性是确保用户在...F5 Networks的多种会话保持机制体现了其对用户会话管理的深入理解和专业解决方案,旨在优化网络性能,提升用户体验,并保障数据的安全传输。

    php使用Cookie实现和用户会话的方法

    在详细介绍PHP如何使用Cookie实现和用户会话的方法之前,需要先对Cookie的概念和原理有所了解。Cookie的基本原理是,当用户第一次访问网站时,网站服务器会向用户的浏览器发送一个或多个Cookie,浏览器会将这些...

    Cookie与Session机制

    虽然Cookie和Session都可以用来跟踪用户会话,但它们各有优势和局限性。 - **使用Cookie**: - 适用于存储少量、不敏感的信息,比如用户偏好设置。 - 可以被浏览器禁用或删除。 - 存储在客户端,安全性相对较低...

    会话技术 之 cookie , session.pdf

    为了使服务器能够跟踪用户的访问状态,引入了会话跟踪技术,包括Cookie和Session。 Cookie是一种客户端会话技术,它将数据保存在客户端的浏览器中。当浏览器首次访问服务器时,如果服务器需要跟踪该用户的状态,会...

    c#实现cookie和session的登陆实例

    在Web开发中,Cookie和Session是两种常见的用户身份验证机制,尤其在C#编程语言中,它们被广泛用于实现登录功能。本实例将探讨如何在C#环境下利用Cookie和Session来处理用户登录状态。 首先,我们要理解Cookie和...

    F5会话保持

    2. 基于Cookie的会话保持:这种方法是使用Cookie来保持会话,服务器在客户端的Cookie中存储一些信息,以便识别客户的身份。F5支持多种基于Cookie的会话保持方法,包括: 2.1 cookie插入模式:在这个模式下,F5会在...

    PHP会话控制SESSION与COOKIE

    在实际开发中,开发者往往结合使用SESSION和COOKIE,比如使用SESSION存储敏感信息,使用COOKIE记录用户的非敏感偏好。合理利用这两种技术,能有效提升网站的用户体验和安全性。 为了进一步学习和实践PHP的会话控制...

    使用Cookie登录每个帐户只需登录一次,然后可以自由切换登录

    Cookie是服务器发送到用户浏览器并存储在本地的一小块数据,通常用于识别用户会话、保持登录状态。这个功能使得用户在不同页面之间或再次访问网站时无需反复输入用户名和密码,提高了用户体验。 首先,我们要理解...

Global site tag (gtag.js) - Google Analytics