使用
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="--"/>
<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
分享到:
相关推荐
在Web开发中,用户登录是常见的功能之一,而使用Cookie技术可以有效地简化这一过程,提供更流畅的用户体验。本练习将探讨如何利用Cookie来管理用户的登录状态,从而避免频繁地发送登录请求。以下是对这个主题的详细...
在IT行业中,特别是JavaWeb开发领域,会话管理是一个至关重要的环节,因为它涉及到用户与服务器交互过程中的数据持久化和用户身份验证。...合理使用Cookie和Session,可以有效地提高网站的用户体验和安全性。
然而,鉴于 Cookie 的使用涉及到用户隐私和安全问题,开发者在使用 Cookie 时需要格外谨慎。正确的使用 Cookie 能够增强网站的功能性和安全性,而错误的使用则可能导致数据泄露和其他安全风险。因此,在开发过程中...
本实践将探讨如何在分布式环境中实现会话追踪,主要采用Cookie和Redis这两种技术手段。 首先,我们要理解会话(Session)的概念。在Web开发中,会话是一种在用户浏览器与服务器之间维持状态的技术,允许跨多个HTTP...
在IT领域,尤其是在Web开发中,Cookie和会话管理是至关重要的概念,它们涉及到用户身份验证、状态跟踪以及用户体验优化等多个方面。以下是对"Cookie会话的操作"这一主题的详细阐述。 Cookie是一种在客户端(用户的...
10. **会话管理**:除了Cookie,ASP.NET还提供了Session状态管理,可以在服务器端存储用户会话信息。然而,Cookie在跨域共享和客户端控制方面更灵活。开发者通常结合Cookie和Session来提供更完善的用户管理。 以上...
1. **Cookie**:Cookie是服务器发送到用户浏览器并存储在本地的一小块数据,它包含了与用户会话相关的信息。当用户再次向服务器发送请求时,浏览器会自动将该Cookie一起发送,服务器通过解析Cookie来识别用户。...
标题“使用Cookie记录用户名和密码”涉及到的是Web开发中的用户会话管理技术,特别是关于Cookie的应用。Cookie是一种在客户端和服务器之间传递信息的小型文本文件,常用于保持用户登录状态、存储用户偏好设置等。在...
Cookie和会话状态是Web开发中的重要概念,用于在客户端和服务器之间保持状态。本文将深入探讨这两种技术的工作原理。...正确使用Cookie和Session可以帮助开发者提供个性化的用户体验,同时确保数据的安全。
`pycookiecheat`是一个方便的Python库,它允许我们从已经验证的浏览器会话中提取Cookie,然后在Python脚本中使用这些Cookie来模拟登录状态。 首先,让我们深入了解一下什么是Cookie。Cookie是服务器发送到用户...
会话技术简单介绍,会话可以简单的理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。会话过程中要解决的一些问题?每个用户与服务器进行交互的过程中,...
cookie-session, 基于简单cookie的会话中间件 cookie会话 基于简单...用户会话可以通过 Cookies 以两种主要方式存储: 在服务器上或者在客户端上。 这个模块在cookie中存储会话数据,而像 express会话的模块在cook
【用户会话完整性的保持】 在信息技术领域,用户会话完整性是确保用户在...F5 Networks的多种会话保持机制体现了其对用户会话管理的深入理解和专业解决方案,旨在优化网络性能,提升用户体验,并保障数据的安全传输。
在详细介绍PHP如何使用Cookie实现和用户会话的方法之前,需要先对Cookie的概念和原理有所了解。Cookie的基本原理是,当用户第一次访问网站时,网站服务器会向用户的浏览器发送一个或多个Cookie,浏览器会将这些...
虽然Cookie和Session都可以用来跟踪用户会话,但它们各有优势和局限性。 - **使用Cookie**: - 适用于存储少量、不敏感的信息,比如用户偏好设置。 - 可以被浏览器禁用或删除。 - 存储在客户端,安全性相对较低...
为了使服务器能够跟踪用户的访问状态,引入了会话跟踪技术,包括Cookie和Session。 Cookie是一种客户端会话技术,它将数据保存在客户端的浏览器中。当浏览器首次访问服务器时,如果服务器需要跟踪该用户的状态,会...
在Web开发中,Cookie和Session是两种常见的用户身份验证机制,尤其在C#编程语言中,它们被广泛用于实现登录功能。本实例将探讨如何在C#环境下利用Cookie和Session来处理用户登录状态。 首先,我们要理解Cookie和...
2. 基于Cookie的会话保持:这种方法是使用Cookie来保持会话,服务器在客户端的Cookie中存储一些信息,以便识别客户的身份。F5支持多种基于Cookie的会话保持方法,包括: 2.1 cookie插入模式:在这个模式下,F5会在...
在实际开发中,开发者往往结合使用SESSION和COOKIE,比如使用SESSION存储敏感信息,使用COOKIE记录用户的非敏感偏好。合理利用这两种技术,能有效提升网站的用户体验和安全性。 为了进一步学习和实践PHP的会话控制...
Cookie是服务器发送到用户浏览器并存储在本地的一小块数据,通常用于识别用户会话、保持登录状态。这个功能使得用户在不同页面之间或再次访问网站时无需反复输入用户名和密码,提高了用户体验。 首先,我们要理解...