十分钟看懂 cookie、session 会话控制

2021-10-10 15:11:00
admin
原创
2471

什么是会话

用户从打开浏览器-->访问某个网站诸多网页-->关闭浏览器后,一个会话就结束了。

类似于打电话:拿起电话-->通话交流-->结束挂断电话,算一次通话。

cookie技术

cookie是一种客户端技术(cookie 是保存在客户端的)。服务器把每个用户的数据以cookie的形式写给用户各自的浏览器,浏览器把cookie数据保存在本地磁盘上。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

什么是 cookie?

服务器在客户端保存用户的数据,比如用户登录名、密码等……就是 cookie。服务器端在需要的时候可以从客户端读取。

注意:这些信息数据量不能太大(小甜饼)。

cookie的基本使用

服务器将信息数据以键值对的形式设置到客户端的 cookie 中(通过http相应头信息传递给客户端)。当再次访问同一服务器站点的资源时,就会自动携带 cookie 中的数据一起访问(通过http请求头信息传递给服务器)。在服务器的每个脚本中都可以接受 cookie 中的数据。

服务端创建 cookie 信息

使用 setcookie() 函数创建一个cookie。通常三个参数,依次是:

  1. cookie 名。

  2. cookie 值。该值须是字符串类型。值是以明文方式保存的,所以不要存储敏感信息。

  3. cookie 的过期时间。这是个 Unix 时间戳。所以,可以用 time() 函数的结果加上希望过期的秒数。time()+60*60*24*30 就是设置 Cookie 30 天后过期。如果设置成零,或者忽略参数,Cookie 会在会话结束时过期(也就是关掉浏览器时)。 

如果要想客户端设置多个cookie,可以通过多次调用setcookie()函数来实现。

要更新某 cookie 值时,只要再用 setcookie() 重新定义一下该 cookie 即可。

注意:

如果设置了cookie过期时间,则cookie存储在cookie文件中;

如果没有设置cookie过期时间,则cookie放在浏览器缓存中,关闭浏览器时,cookie即过期删除。

获取客户端cookie信息

任何从客户端发送过来的cookie信息,都被自动保存在 $_COOKIE 全局数组里,每个PHP脚本都可从该数组中获取cookie信息。

比如 cookie名是 'cookiename',则可通过 $_COOKIE['cookiename'] 获取它的值。 

在设置cookie的脚本中,第一次获取它的信息并不会生效,必须刷新或到下一个页面菜可以看到cookie的值。因为cookie要先被设置到客户端,再次访问时才能被发送回来,这时才能获取(通过http协议Cookie属性,从客户端传递给服务器。 )。

删除cookie信息

服务器端说要删除 cookie 信息,则浏览器收到指令将本地 cookie 删除。

删除指定 cookie 键值对:

只需将 setcookie() 中的过期时间戳 -1 即可(cookie 值设置为空""),即:time()-1。

删除所有 cookie 键值对:

使用 foreach 遍历删除 $_COOKIE 数组即可。

foreach($_COOKIE as $key=>$value)
{
setcookie($key, $value, time()-1);
}

session技术

session 与 cookie 类似,都是用来存储用户信息数据。但二者最大的区别在于:cookie是将用户信息存储在客户端,而 session 将用户信息存储在服务器。

使用 session 跟踪一个用户,是通过在各个页面之间传递唯一的 sessionID,并通过 sessionID 提取该用户在服务器中保存的session变量。同一个用户在 session 中注册的变量,在整个会话期间的各个页面中该用户都可以使用,每个用户使用自己的变量。

在客户端,仅需保存由服务器为用户创建的一个 sessionID,而在服务器端保存 session 变量的值。sessionID 是一个唯一的长字符串,每个用户都不同。

sessionID 会保存在用户客户端的cookie里,如果客户端禁用了 cookie,则会将 sessionID 保存在用户请求的 URL 中传递。

创建/初始化session

不同于 cookie 直接创建设置,session 有一个开关,必须先启动才可使用。——session_start() 函数

session_start()    //创建 session,开始一个会话,进行 session 初始化。

该函数无参数。

当用户第一次访问网站时,服务器端会通过 session_start() 函数创建一个唯一的 sessionID,并自动通过 http 响应头,将这个 sessionID 保存到客户端的 cookie 中。同时,也在服务器端创建一个以这个 sessionID 命名的文件,用于保存这个用户的会话信息。当同一用户再次访问网站时,也会自动通过 http 的请求头将客户端 cookie 里的 sessionID 在携带过来,这时 session_start() 函数 就不会再去分配一个新的 sessionID 了,而是在服务器中查找与该 sessionID 同名的 session 文件,将之前该用户的会话信息读出加载到  $_SESSION,在当前脚本中应用,达到跟踪该用户会话的目的。所以在会话期间,同一个用户在访问服务器上的任何一个页面时,都是使用同一个 sessionID。

类似于顾客在商场购物,只需要记住自己的会员卡号,凭此卡号调用商场的会员信息进行 shopping。

注意:cookie中sessionID的默认有效期限值为0,即与浏览器共存亡,有效期直到浏览器关闭。

注册和读取session变量

通过访问 $_SESSION 数组来完成注册和读取 session 变量。该数组必须在代用 session_start() 开启 session 之后才能使用。

注册的变量在页面间是持久保持的,并且变量的修改从一个页面到其他页面是可见的。

注册和读取 session 的同时,也会在session文件里存取数据。所以,$_SESSION 数组就像是一个中介,虽然感觉像是直接操作 $_SESSION 中存取信息,事实上,读取时,是先从 session 文件里把 session 数据放到 $_SESSION 中,再调用的。

注销变量和销毁session

如果用户要退出web应用,需要为他提供一个注销的功能,把他的所有信息在服务器中销毁。

使用 session_destroy() 函数销毁和当前 session 相关的所有信息,并清空会话中的所有资源。

该函数与 session_start() 作用相反,用来关闭session,删除 session 文件。

session_destroy() 函数不会释放与当前session相关的变量,也不会删除保存在客户端cookie中的 sessionID。

用unset()释放指定变量,或直接将 $_SESSION 赋值一个空数组以全部清除。

sessionID 须用 setcookie() 进行删除。在 cookie 中,保存 sessionID 的 cookie 名称就是 session 名,而该 session 名是在 php.ini 中通过 session.name 属性指定的,php 中可以通过调用 session_name() 函数获取该 session 名称。

session注销4步骤:

<?php
//第一步:开启session并初始化
session_start();
//第二步:删除所有session变量
$_SESSION = array();
//第三步:删除sessionID
if (isset($_COOKIE[session_name()]))
{
setcookie(session_name(), "", time()-42000);
}
//第四步:最后彻底销毁session
session_destroy();


版权声明

版权声明:本站原创文章,转载请注明作者和出处。

本站点采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议