教育培训&老师&互联网&创业程序员程序猿

三、理解session和cookie

2019-03-15  本文已影响15人  langkong
服务器为何需要知道谁在请求

http请求是无状态的,客户端浏览器发送请求到服务端,服务端处理请求并返回就结束了,当该客户端再次请求服务端,是无法知道是否为同一个用户在访问。例如用户在购物网站选择商品加入购物车,下单结算。用户再次访问该网站,是需要获得自己购物车数据,订单中商品数据的。

何为一次会话

我们使用浏览器访问一个网站,不管我们在该网站点击了多少链接,进入过多少页面,直到我们关闭浏览器称之为一次会话。

如何识别是否是同一个用户发送的多次请求

用户使用浏览器第一次请求服务端,服务端如果能产生一个唯一id,并将这个id发送给客户端浏览器,以后用户再在该网站访问其他页面时将这个id携带上一并发送给服务器,服务器不就知道这些请求来自同一个id,即同一个用户。我们提供登录页面,用户输入账户名、密码登录,我们将这个id对应到这个账户名上存储在服务器文件里,用户再发送请求过来时携带上这个id,服务器拿到这个id从文件中寻找,找到对应的用户名,就可以知道这次请求是这个账户了。

session和cookie

session就是服务端产生的这个唯一id,并存储在服务端文件中,cookie则保存着这个id,每次访问服务器都会携带上这个id。

当我们使用浏览器第一次访问一个网站,服务器发现没有id就会产生一个唯一session id,并存储在服务器上,同时会发出写cookie的指令,用户浏览器接收到写cookie指令就会在用户电脑的临时目录生成cookie文件,并包含键名为PHPSESSID,值为这个id。以后访问该网站,浏览器会自动携带该cookie。

【cookie有有效期,不设置则为会话级别,即关闭浏览器这个cookie就失效了】cookie存储在用户本地电脑,所以安全性很差,不能将敏感信息存入其中,例如密码。

session的过期时间一般为每次访问则延长为当前时间30分钟后的时间。所以用户长时间不操作就会过期,要求重新登录,此时服务端seesion id也会刷新,并发出写cookie指令要求浏览器更改id值。

不同网站要求浏览器写cookie,浏览器访问某网站,只会携带该网站的cookie。

cookie在相同内核的浏览器之间是共享的,不同内核浏览器是不共享的例如火狐和IE【存放位置都不同,当然不共享】

7天自动登录如何实现
现象:

当我们登录一些网站,直接关闭浏览器而非点击退出,再次打开该浏览器则还是登录状态

原因:

点击退出称为安全退出,其实就是点击退出,服务器程序则销毁了我们存储在服务端的session内容和id,直接关闭则没有删除服务器端session,而cookie的过期时间设置一般会比较长,关闭浏览器,访问该网站的cookie还在我们本地电脑上存储着,所以当打开浏览器再次访问该网站的时候就会携带上该网站的cookie,服务器端还存在session id,能够匹配到账户,所以还是登录状态。如果将cookie设置成会话级别,关闭浏览器cookie就过期消失了,打开浏览器再次访问该网站已无该网站cookie携带了,也就不会是登录状态。所以要实现7天自动登录,要存储服务端的session和cookie 7天过期,cookie要进行加密存储,再次访问网站完成自动验证登录。

session过期特别说明:

session的过期是发呆时间,假如设置10分钟过期,当9分钟的时候你操作了这个页面则会重新计时。

session配置:

session 可以通过php.ini配置,来修改session存储的位置,默认会以文件形式存储在服务器上,设置成user就可以自定义处理器来存取session数据。企业中一般会存储在redis和数据库中,应对高并发和负载均衡多台服务器间session共享。

vi /usr/local/etc/php/7.2/php.ini 
session.save_handler = files

禁用cookie,还可以登录吗?

服务器端产生的session id,如果cookie被禁用,服务器发送的写cookie指令就无法将session id 写入到客户端电脑cookie中,访问该网站就无法携带cookie过去,也就无法拿到session id。关键问题是cookie不能作为中介携带session id 给服务器,可以换一个,例如浏览器在访问该网站其他页面时,在其url后面自动携带上PHPSESSID=xxxxxxxxxxxxx的参数就可以,服务器获得该参数也一样可以识别是哪个客户端在访问。如何设置url上进行携带,只要在服务器端进行配置。

上一篇下一篇

猜你喜欢

热点阅读