(一)、session工作机制介绍
- 为每个访问者创建一个唯一的id(<b>UID</b>)
- 然后基于这个UID来存储变量
- UID 存储在 cookie 中,或者通过 URL 进行传递
(二)、举个栗子
1、第一次访问某网站
这时服务器生成一个不重复的 <b>SESSIONID</b> 的文件,比如在/var/lib/php/session目录。
2、php会设置sessionid在返回的Response的HTTP头
PHP的sessionid默认的名字是<b>PHPSESSIONID</b>
3、客户端接收到Set-Cookie,将PHPSESSIONID写入cookie
4、当你第二次访问页面时,请求头(Request)会携带cookie发送给服务器端
5、服务器根据cookie里的PHPSESSIONID去session目录查找对应session文件
6、找到这个session文件后,检查是否过期,如果没有过期,去读取Session文件中的配置;如果已经过期,清空其中的配置
<p>如果客户端禁用了Cookie,那PHPSESSIONID都无法写入客户端,Session还能用?
答案显而易见:不能
而且禁用cookie之后,服务端没有接收到你cookie里面携带的<b>PHPSESSIONID</b>,那么基于HTTP是无状态的,那么你每一次请求,服务器都会当作是第一次请求,这样,每次都会生成一个唯一的sessionid文件。
<p>
(三)、那么我们还能用session吗?
我可以通过参数来处理嘛。通过GET或者POST请求,传递参数的方式传递sessionid不就可以了吗
GET http://www.xx.com/index.php?session_id=xxxxx
在渲染页面的时候,强制的给一个sessionid,然后请求的时候再传回来,不就和cookie的方式一样了吗。
但是这样做的方式是不可取的。为什么?
你只要将这个网站发送给别人,那么他将会以你的身份登录并做所有的事情。
所以千万不要使用这种方式,我只是举这个栗子,来让大家更深刻的理解session的机制和原理。
(四)、现状
在现在cookie几乎是不会被禁用的,因为现在网站都非常依赖cookie。然而我们使用session的方式还是需要依赖cookie,不要去使用参数传递这种不可取的方式。