惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Darknet – Hacking Tools, Hacker News & Cyber Security
Jina AI
Jina AI
博客园_首页
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
L
Lohrmann on Cybersecurity
Forbes - Security
Forbes - Security
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
The Register - Security
The Register - Security
N
News | PayPal Newsroom
S
Security Archives - TechRepublic
量子位
Cisco Talos Blog
Cisco Talos Blog
V
V2EX
C
Cisco Blogs
The Cloudflare Blog
Stack Overflow Blog
Stack Overflow Blog
L
LangChain Blog
Scott Helme
Scott Helme
S
Securelist
Security Latest
Security Latest
爱范儿
爱范儿
TaoSecurity Blog
TaoSecurity Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
I
Intezer
L
LINUX DO - 最新话题
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Check Point Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
美团技术团队
Know Your Adversary
Know Your Adversary
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
PCI Perspectives
PCI Perspectives
月光博客
月光博客
T
Tailwind CSS Blog
Cloudbric
Cloudbric
小众软件
小众软件
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
K
Kaspersky official blog
D
DataBreaches.Net
博客园 - 【当耐特】
有赞技术团队
有赞技术团队

博客园 - 银翼

【MySQL】Windows下如何彻底卸载MySQL? 【MySQL】Windows下如何重置root账号密码? 【Java】Task07实验4第5题解析 【辅导】Task12 类的定义与继承练习 【辅导】Task11 如何获取文件上传错误信息 PHP开发环境配置 XAMPP更换Apahce服务端口号 《Web应用开发技术(PHP)》往届学生优秀作业 【辅导】Task19 实现用户登录 主要知识点 【辅导】Task18 更新与插入删除操作 主要知识点 【辅导】Task17 查询数据 主要知识点 【辅导】Task16 使用MySQL数据库 主要知识点 【辅导】Task15 熟悉错误与异常处理 主要知识点 【辅导】Task14 使用正则表达式 主要知识点 【辅导】Task13 使用会话管理 主要知识点(2) 【辅导】Task12 使用类和对象 主要知识点(2) 【辅导】Task12 使用类和对象 主要知识点(1) 【辅导】Task11 熟悉PHP文件操作 主要知识点 【辅导】Task10 掌握PHP表单处理 主要知识点
【辅导】Task13 使用会话管理 主要知识点(1)
银翼 · 2020-04-09 · via 博客园 - 银翼

会话是学习动态网站设计的重点内容。只有掌握了会话管理,才能说明你学会了动态网站设计;只有掌握了数据库管理,才能说明你学会了信息系统的设计与开发。

这个任务我们分成两阶段来学习,第一阶段熟悉什么是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。