您的位置:首页 > 编程语言 > PHP开发

Cookie/Session机制解析

2018-03-05 17:04 232 查看
一、cookie 机制
在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。注意:Cookie功能需要浏览器的支持。如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效,不同的浏览器采用不同的方式保存Cookie。
Cookie的不可跨域性
很多网站都会使用Cookie。例如,Google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie。那浏览器访问Google会不会也携带上Baidu颁发的Cookie呢?或者Google能不能修改Baidu颁发的Cookie呢?不会的!!!Cookie具有不可跨域名性。因此就引申出一个问题cookie不可跨域,那么如何实现单点登录呢?这就需要cookie共享(后面的文章会讲到)。
cookie生命周期
Cookie的maxAge决定着Cookie的生命周期,单位为秒(Second)如果Cookie不设置maxAge(默认值为-1)或者其值为负的话,那么我们称为临时性Cookie,其生命周期为浏览器会话的时间,只在本窗口以及相应的自窗口有效,一旦关闭浏览器,Cookie就失效了。如果设置maxAge属性为正值,则浏览器会将maxAge的值写入对应的Cookie文件中。无论是关闭浏览器还是关闭电脑,只要对应的时间还没有到,登陆网站时此Cookie仍然有效。如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除,cookie保存中文
中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码。一般推荐使用UTF-8编码。
ps:关于cookie的增删改查操作就不多提了,参考资料非常多。
二、Session机制Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
当多个客户端执行程序时,服务器会保存多个客户端的Session。获取Session的时候也不需要声明获取谁的Session。Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见。Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。
提示:Session的使用比Cookie方便,但是过多的Session存储在服务器内存中,会对服务器造成压力。Session的生命周期
由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。比如php7中默认的session生存周期是1440秒(24分钟),这个时间就是Session的生命周期,如果超过了生命周期没访问过服务器,Session就自动失效了。也就是说假如生存周期为24分钟,你直接超过24分钟没有访问服务器则你对应的session直接失效,但是如果你第20分钟访问了,然后退出了,再过20分钟依然可以访问(这个概念要清晰)。可以直接对Session的生命周期进行设置也可以在相应的开发语言中配置,例如:php.ini等Session是如何实现的
许多人会有这样一个误区,session是必须通过cookie实现的,其实不然。Session默认是通过cookie来实现的。cookie存储session_id然后传给服务器来获取相应的session。既然只是要一个session_id,那么就可以用get,post等方式传送,如get中重写url的方式。那也就解决了浏览器不支持(禁用)cookie的问题。服务端获取session内的值,只需要找到对应session_id就可以拿到某个用户的session了,并非需要cookie,设置session可通过session_id()函数。
本文部分取自:http://blog.csdn.net/fangaoxin/article/details/6952954(一篇较早但非常好但文章)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php session cookie 会话