会话是学习动态网站设计的重点内容。只有掌握了会话管理,才能说明你学会了动态网站设计;只有掌握了数据库管理,才能说明你学会了信息系统的设计与开发。
这个任务我们分成两阶段来学习,第一阶段熟悉什么是Cookie和Session,第二阶段掌握使用Session和Cookie来设计网站登录,实现功能界面是授权用户才能访问。
1、http协议是无状态的协议
无状态含义:
无状态是指协议对于事务处理没有记忆功能。缺少状态意味着,假如后面的处理需要前面的信息,则前面的信息必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要前面信息时,应答就较快。直观地说,就是每个请求都是独立的,与前面的请求和后面的请求都是没有直接联系的是相互隔离的,请求本身包含了相应端为相应这一请求所需的全部信息。
1、协议对于事务处理没有记忆能力;
2、对同一个url请求没有上下文关系;
3、每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况;
4、服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器。
实际中的使用情况:
在web应用中,我们使用http协议,但是我们需要的web是有状态的,因此加入了cookie、session等机制实现有状态的的web。
web=http协议+状态机制+其他机制
为什么不改进http协议使之有状态?
最初的http协议只是用来浏览静态文件的,无状态协议已经足够,这样实现的负担也很轻(相对来说,实现有状态的代价是很高的,要维护状态,根据状态来操作。)。随着web的发展,它需要变得有状态,但是不是就要修改http协议使之有状态呢?是不需要的。因为我们经常长时间逗留在某一个网页,然后才进入到另一个网页,如果在这两个页面之间维持状态,代价是很高的。其次,历史让http无状态,但是现在对http提出了新的要求,按照软件领域的通常做法是,保留历史经验,在http协议上再加上一层实现我们的目的(“再加上一层,你可以做任何事”)。所以引入了其他机制来实现这种有状态的连接。
哪些方法可以实现有状态连接?
cookies, session, application
【无状态】
有人将web应用中有无状态的情况,比着顾客逛商店的情景。
顾客:浏览器访问方;
商店:web服务器;
一次购买:一次http访问(就是相当于一次会话)
我们知道,上一次顾客购买,并不代表顾客下一个小时一定会买(当然也不能代表不会)。也就是说同一个顾客的不同购买之间的关系是不定的。所以说实在的,这种情况下,让商店保存所有的顾客购买的信息,等到下一次购买可以知道这个顾客以前购买的内容代价非常大的。所以商店为了避免这个代价,索性就认为每次的购买都是一次独立的新的购买。浅台词:商店不区分对待老顾客和新过客。这就是无状态的。
但商店为了提高效益,搞促销,想鼓励顾客多购买,发展会员,会员有折扣,怎么办呢?
【Cookie】
给顾客发一张购物卡(磁条卡或IC卡,里面存储客户消费信息),凭会员卡购物有优惠(充1000送200)。这就是Cookie。
【Session】
给顾客发一张会员卡(甚至是虚拟卡,只要记住会员号就可以了,比如手机号),用户消费信息记录在商店的服务器中。这就是Session。还可以实现积分兑换等高级功能。
【Application】
疫情期间商店为拉动消费,自主决定,所有人只要来,全场88折。这是Application。(PHP没有Application)
其实,这些机制都是在无状态的传统购买过程中加入了一点东西,使整个过程变得有状态。Web应用就是这样的。
(参考CSDN博主zhangvalue的《http协议是无状态协议》)
2、什么是Cookie
Cookie就是你访问网站的时候,网站在你的计算机上留下了个小文件(类似于上面的购物卡。它可不问你要不要留,只要你的浏览器同意存储Cookie它都会留下来。你要不同意,大多数网站你都登录不了,因为登录要使用Session,而Session要借助临时Cookie才能实现)。不同浏览器的存储方式不一样,查看方式也不一样。课件中介绍了谷歌浏览器的Cookie的查看方式。
3、如何创建和删除Cookie
在PHP中,创建Cookie使用setcookie()函数:
setcookie($name, $value, $expire, $path, $domain);
- $name是cookie的名字
- $value是cookie的值,只能是文字,如果是其它类型,也会按PHP规则转换为string
- $expire是unix时间戳,很关键,指定cookie的过期时间。以前的时间就是用删除cookie,未来的时间就可创建持久化cookie,没有指定时间就是临时cookie,只在本次会话时有效。(什么是会话?)
- $path和$domain用来指定有效路径和域名,比较复杂,一般不用。
- 特别注意:setcookie()函数使用时,必须在任何html输出之前,否则无效。
语句:$_COOKIE["name"] = $value;只能创建临时cookie。
读取Cookie使用系统变量$_COOKIE就可以了:
echo $_COOKIE["name"];
可以创建多值Cookie,注意多值Cookie的创建与读取方法:
Cookie过期以后会自动删除,要主动删除,创建Cookie时指定过期时间为过去的某个时间就可以了。
注意:Cookie中保存的只能是字符串信息。Int等标量类型会自动进行类型转换,但数组、对象不支持自动转换。所以要另外想办法。课件中介绍了两种方法:
- 使用序列化函数serialize()和反序列化函数unserialize()
- 使用JSON编码函数json_encode()和json_decode(),但要注意json解码时得到的是stdClass对象(即object对象),只能得到数据,丢失了方法。
4、什么是Session?
Session,就是会话,从你打开浏览器访问这个网站开始,只要浏览器没关,不管你在这个网站多少网页,这都是一次会话。
什么时候会话结束呢?你关闭浏览器并不意味着Sesison马上会失效,因为服务器端是没办法侦测到你什么时间关闭浏览器。它只能侦测到你多长时间内一直没有访问请求,就认为过期了。这意味着,如果没有任何处理的话,你浏览器开着,好长一段时间没有刷新页面或者访问这网站的其它页面,它就认为Session失效了。大多数网站会要求你重新登录。
这个失效时间是多少呢?1440秒(24分钟)
Session是借助临时Cookie来工作的(需要向服务器传递Session_ID),因此你不能禁用浏览器的Cookie。
使用Session前必须使用session_start()函数启用Session。不管是读还是写Session。(我们读取Session时如果忘记了这一条,会读取失败)
读写Session都是使用$_SESSION系统变量:
session_start();
$_SESSION["name"]=$value;
$name = $_SESSION["name"];
读取Session前最好是使用isset函数判断下这个Session是否存在,读取Cookie也一样。
SESSION中可以存储任意类型数据,包括对象。这给我们带来很大方便。但还是建议不存储太大量的数据,比如,你存储购物车的数据是可以的,但你不能把一个班的全部成绩存储进去,一是Session数据也要通过http协议传递到下一个网页,数据量过大会拖慢浏览器,二是容易数据泄露。
5、Cookie一般应用在什么地方?
登录时记住用户名
免登录(可能要存储加密后的密钥。比较危险,不建议使用,因为Cookie可能会被冒用)
保存用户浏览历史,探知用户感兴趣的内容。(可能会被用户清除Cookie)
6、Session一般应用在什么地方?
用户登录
所有网站要验证用户身份,都要用到Session。
在网站各网页传递与用户身份有关的数据,Session是最安全高效的。
只要是动态网站,都要用到Session。