十分钟看懂 cookie、session 会话控制
- 2021-10-10 15:11:00
- admin 原创
- 2261
什么是会话
用户从打开浏览器-->访问某个网站诸多网页-->关闭浏览器后,一个会话就结束了。
类似于打电话:拿起电话-->通话交流-->结束挂断电话,算一次通话。
cookie技术
cookie是一种客户端技术(cookie 是保存在客户端的)。服务器把每个用户的数据以cookie的形式写给用户各自的浏览器,浏览器把cookie数据保存在本地磁盘上。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
什么是 cookie?
服务器在客户端保存用户的数据,比如用户登录名、密码等……就是 cookie。服务器端在需要的时候可以从客户端读取。
注意:这些信息数据量不能太大(小甜饼)。
cookie的基本使用
服务器将信息数据以键值对的形式设置到客户端的 cookie 中(通过http相应头信息传递给客户端)。当再次访问同一服务器站点的资源时,就会自动携带 cookie 中的数据一起访问(通过http请求头信息传递给服务器)。在服务器的每个脚本中都可以接受 cookie 中的数据。
服务端创建 cookie 信息
使用 setcookie() 函数创建一个cookie。通常三个参数,依次是:
cookie 名。
cookie 值。该值须是字符串类型。值是以明文方式保存的,所以不要存储敏感信息。
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();
版权声明:本站原创文章,转载请注明作者和出处。
五色鱼博客2022-12-27
我过来看看
五色鱼博客2022-10-26
不错,就是我不懂,但是还是赞一下
曾经沧海2022-10-09
赞
优获的守护者UHO.cc2022-09-30
学到了,感谢大佬
王2022-04-04
真棒