cookie和session
1.什么是Cookie
cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。
2.Cookie机制
Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。Cookie机制可以弥补HTTP协议无状态的不足。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie(服务器通过随着响应发送一个http 的Set-Cookie 头)。客户端浏览器将在客户端的磁盘上创建一个cookie 文件,会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。
3.PHP里如何使用Cookie
创建 cookie
bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )
除了$name别的参数都是可选的。String型的参数可以设置为””来跳过,$expire是int型,可以设置为0来跳过
例子
<?php $value = 'something from somewhere'; setcookie("TestCookie", $value); setcookie("TestCookie", $value, time()+3600); /* expire in 1 hour */ setcookie("TestCookie", $value, time()+3600, "/~rasmus/", "example.com", 1); ?> |
使用 header()设置cookie;
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]");
获取cookie
PHP 的 $_COOKIE 变量用于取回 cookie 的值。
<?php echo $_COOKIE["TestCookie "]; print_r($_COOKIE); ?> |
删除cookie
通过把失效日期设置为过去的日期/时间,删除一个 cookie
<?php setcookie("TestCookie ", "", time()-3600); ?> |
4.什么是Session
会话(session)是通过在服务器上存储用户信息以维持一个客户与服务器之间的不中断的请求响应序列。
5.Session机制
为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。
当开始一个会话时,PHP 会尝试从请求中查找会话 ID (通常通过会话 cookie), 如果请求中不包含会话 ID 信息,PHP 就会创建一个新的会话。 会话开始之后,PHP 就会将会话中的数据设置到 $_SESSION 变量中。 当 PHP 停止的时候,它会自动读取 $_SESSION 中的内容,并将其进行序列化, 然后发送给会话保存管理器来进行保存。
用户再访问页面时,会将这一会话ID提交到服务器端,来存取Session数据。服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值
一些会话配置选项:
session.save_path 定义了传递给存储处理器的参数。如果选择了默认的 files 文件处理器,则此值是创建文件的路径。默认为 /tmp。
session.save_handler 定义了来存储和获取与会话关联的数据的处理器的名字。默认为 files。
session.name 指定会话名以用做 cookie 的名字。只能由字母数字组成,默认为 PHPSESSID。
session.use_cookies 指定是否在客户端用 cookie 来存放会话 ID。默认为 1(启用)。
session.cookie_lifetime 以秒数指定了发送到浏览器的 cookie 的生命周期。值为 0 表示“直到关闭浏览器”。默认为 0。
6.PHP里如何使用Session
开始 PHP Session
<?php session_start(); ?>
<html> <body>
</body> </html> |
上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。
存储 Session 变量
存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量:
<?php session_start();
if(isset($_SESSION['views'])) $_SESSION['views']=$_SESSION['views']+1;
else $_SESSION['views']=1; echo "Views=". $_SESSION['views']; ?> |
终结 Session
如果您希望删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。
unset() 函数用于释放指定的 session 变量,session_destroy() 函数彻底终结 session。
<?php unset($_SESSION['views']); session_destroy(); ?> |
7.Cookie和Session区别
cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
Cookie变量的值保存在客户端。session变量的值保存在服务器端,通过SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,我们叫做session cookie,以区别persistentcookies。注意sessioncookie是存储于浏览器内存中的,并不是写到硬盘上的。session cookie针对某一次会话而言,会话结束sessioncookie也就随着消失了,而persistentcookie只是存在于客户端硬盘上的一段 文本(通常是加密的),而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,自然不如session cookie安全了。
Session是保存在服务器端的,每个用户都会产生一个Session。如果并发访问的用户非常多,会产生非常多的Session,消耗大量的 内存。而Cookie保存在客户端,不占用服务器资源。