seion和cookie会话技术总结_会话cookie
seion和cookie会话技术总结由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“会话cookie”。
什么是会话控制
出现原因:http是无状态协议的,每次都是不同的服务器请求,无法维护两个请求事务之间的关系.会话控制:能够在网站中跟踪一个变量,通过对变量的跟踪,就可以使多个请求事物之间建立联系,根据授权和用户身份显示不同的内容,不同页面
cookie:是服务器设置在客户端的文本文件,保存客户端的个人信息.什么是Cookie: 1.2.3.cookie是在http协议下,服务器或脚本在客户端保存维护信息的一种方式
cookie是web服务器保存在客户端的一个很小的文本文件,保存客户端的信息,提高网页的处理效率,降低服务器负担
cookie保存在客户端,通常在浏览器的cookie临时文件夹中,可以手动的删除.如果cookie太多超过系统的允许范围,系统将自动删除
cookie的工作原理
1.当用户访问基于php技术的网站时,在php中可以使用setcookie()函数生成一个cookie,系统经过处理,将cookie发送到客户端并保存在C:Documents and Setting用户名Cookies目录下
2.cookie是http标头的一部分,在它之前不能有任何输出,空格和换行都不可以
3.当客户端再次访问网站时,浏览器会自动把cookie目录下与该站点对应的cookie信息发送到服务器,服务器将自动把客户端传来的cookie转化成php的变量,.php5中存放在$_COOKIE全局数据中
4.接受和处理cookie.使用$_COOKIE获取
COOKIE的参数设定
Setcookie(键,值,有效期=0,有效路径=‘’,有效域名=‘’,是否仅安全连接传输=false,是否HTTPonly=false)
1、键:设置cookie的名字,数据是在响应阶段被传输到浏览器端的2、值:设置cookie的值
Tip:增加,修改,删除,都使用该函数setcookie()完成!
3、有效期:默认浏览器关闭(会话周期结束)时,COOKIE失效。也成之为:会话COOKIE(临时COOKIE)
允许设置COOKIE的有效期,语法上,使用setcookie的第三个参数进行设置,通过unix时间戳(从1970年到现在的秒数,PHP函数time()来获取当前时间戳。)来设置COOKIE的有效期。
当用户下次访问您的站点的时候,浏览器会先检查您站点的所有cookie,如果某个cookie已经过期,浏览器不会把这个cookie随页面请求一起发送给服务器,而是删除这个已经过期的cookie。时间点是从cookie被创建时候当前时间开始计算。谁来判断该COOKIE是否过期?(是否在有效期内)浏览器
OR 服务器?
是浏览器判断该COOKIE是否过期的。
在设置COOKIE时,同时将COOKIE的有效期,告知(传输)到浏览器端。如何删除COOKIE:
Time()-1: 删除COOKIE通用做法,强制设为过期。
注意: 当cookie被删除时,它的值在当前页面仍然有效.如果要把cookie设置成在浏览器关闭后就失效.那么可以把expiretime的值设为0,或者不设此值
4、path有效路径(使用较少):默认仅在当前目录及其后代目录有效。使用空字符串表示
默认值!通常如果需要设置,就是将COOKIE设置为 / 根目录下有效,表示整站有效。
5、有效域(使用频率较高):某个域名下设置的COOKIE,仅仅可以在当前域名下所使用
COOKIE,支持在一级域名内(所有的二级域名之间)进行COOKIE数据共享。
6、secure是否仅安全连接(https)传输:
告知浏览器,我们所设置的cookie,是否仅仅在https这个协议下,才会被发送到浏览器端!用 参数 第六个完成设置:默认值false,表示都可以(http和https)。
7、HTTPONLY:
所设置好的COOKIE,是否仅仅在http请求时所使用。COOKIE还可以通过浏览器端的脚本(javascript)获取到。function getCookie(){
alert(document.cookie);} 如果需要禁止浏览器端其他脚本使用该cookie,则使用第七个参数即可,默认false,设置为true表示除了http请求,其它地方(javascript)不可以用
COOKIE的有效期:
设置方法如下:
setcookie(“cookie_name”, “abcd”, time()+3600);
解释:这个cookie有3600秒的有效期;
cookie有效期在退出作用域那一刻开始生效;
重新访问又有3600秒,设置cookie时,不会考虑之前的是否设置cookie和cookie是否有效,可以认为是强制设置。
如果关闭浏览器重新打开又重新算(当然这个要php.ini设置了关闭浏览器立即失效的开关),其实就是打开页面产生cokeie开始算起,如果你打开页面产生cokeie的时间有1800秒了,假如设置的3600秒失效,再次刷新页面就剩1800秒了 PHP手册上关于setcookie函数的expire参数有这样一个解释:
If set to 0, or omitted, the cookie will expire at the end of the seion(when the browser closes).如果设为0 或者忽略该参数, cookie将在seion结束时(关闭浏览器时)过期 COOKIE的注意事项
1.setcookie()之前不能有任何的输出,空白和空格也不行(Setcookie()为头信息设置)2.setcookie()之后在当前页面echo时不会输出,必须刷新或到下一个页面才会输出
3.不同浏览对cookie的处理不同,客户端可以禁用cookie,而且对浏览器的数量有限制.一个浏览器可以最多创建300个cookie,每个不能超过4kb,每个站点最多设置20个 4.避免过度依赖cookie,因为客户端会禁止掉cookie 什么是seion? 1.seion从用户访问页面开始,到断开与网站的连接为止,形成一个会话的生命周期.在会话期间,分配客户唯一的一个seionID,用来标识当前用户,与其他用户进行区分
2.seion会话时,seion会分别保存在客户端和服务器端的两个文件,对于客户端:使用临时的cookie保存(cookie的名称为PHPSESSID)或者通过url字符串的形式传递.服务器端也以文本的形式保存在指定的seion目录中
3.seion通过id接受每一次访问的请求,从而识别当前用户,跟踪和保持用户的具体资料,以及seion变量,可在seion中存储数字或文字资料.比如seion_name.这些信息都保存在服务器端
4.seionID可以作为会话信息保存到数据库中,进行seion持久化.这样可以跟踪用户的登陆次数,在线与否,在线时间
如何销毁seion1、unset($_SESSION['XXX']):用于删除单个seion变量
注意:不要使用unset($_SESSION),此函数不可用,会删除全局的$_SESSION销毁
2、$_SESSION=array():删除多个seion变量
3、销毁seion_destroy():结束当前的会话,并清空会话中的所有资源.该函数不会unset(释放)和当前seion相关的全局变量,也不会删除客户端的seion cookie4、清空seion值 seion_start();$_SESSION=array();seion的过期时间
seion的过期时间由两方面决定的;
1存储在客户端的$_COOKIE['PHPSESSID']的过期时间(默认cookie名称为PHPSESSID,可通过php.ini中的seion.name修改。)
2.存储在服务器端的相对应的seion文件(seion文件名和上述cookie的值一一对应),默认为1440秒,即24分钟
两者的关系: 当执行seion_start()的时候,其实是做了两件事:
1,检查客户端发送过来的的所有cookie(当然也包括$_COOKIE['PHPSESSID'], 如果有的话),根据$_COOKIE['PHPSESSID']的值(这是由apache产生的随机字符串,如0lkbd2se458r600m2m7o1r4ic5)来访问 相对应的 seion文件,这两者是一 一对应的关系。当然文件里面的值是经过序列化的2,如果客户端没有传来$_COOKIE['PHPSESSID'],就会有服务端产生一个随机的$_COOKIE['PHPSESSID']并存储在客户端。需要理解:
1、在seion_start()开启之后,当seion数据对应的PHPSESSIONID的cookie已经超时,无法传回到服务器端,此时由于seion开启,系统会自动再重新分配一个SESSIONID标识,SESSIONID默认是存储于浏览器端。
2、同时在seion_start开启之后,如果之前有存储过seion,并且没有过期,则会获取到已经存好的seion,如果没有存储过seion,则seion机制默认也会自动分配一个SESSIONID给浏览器,同时在服务器端生成对应的文件,此时的seion是一个过期的会话
如何设置 seion数据的属性?
设置COOKIE中seion-ID这个COOKIE变量属性即可!方案一,配置 php.ini 方案二,在脚本中,开启seion之前使用函数进行配置 ini_set('seion.cookie_lifetime','3600');ini_set('seion.cookie_domain','.baidu.com');@seion_start();采用下面的函数进行设置:
Seion_set_cookie_params(有效期,有效路径,有效域,是否仅安全连接传输,是否HTTPONLY)实际环境中,很少改seion的有效期。经常改有效域名。seion_set_cookie_params(0,'/', '.baidu.com');Seion数据区操作:
重写seion的存储机制:
Seion数据区默认以 文件的形式存储与服务器操作系统临时目录中!
当 seion数据区过多时,文件形式的存储,操作速度变慢,磁盘的读写开销很大 重写seion入数据库: 共6个函数
Seion_set_save_handler(开始函数,结束函数,读函数,写函数,删除函数,GC函数);告知seion机制,在需要读写时,使用用户自定义的读写函数完成!这个函数仅仅是设置告知,不是调用,以上6个函数,在seion机制运行到某个时间点时,才会被调用!
垃圾回收操作: seGC()垃圾:服务器上过时的seion数据区。垃圾如何判定?
如果一个seion数据区已经超过多久没有使用(最后一次写操作)了,就是被视为垃圾数据。
该时间临界点:默认1440s。可以被配置:seion.gc_maxlifetime = 1440 判断过期条件:Last_write
在 seion_start()过程中,开启seion机制过程中:有几率地执行 垃圾回收操作。一旦执行,就会删除所有的过期的垃圾数据区。默认的概率为1/1000。可以设置该几率:
可能性:Seion.gc_probability 基数(除数):Seion.gc_divisor 建议在脚本周期调整,使用函数ini_set(),在开启seion机制前完成实现 seGC():PHP的seion机制将 最大有效期作为参数,传递过来!语法细节:
要注意先设置再开启seion机制
PHP配置项:seion.save_handler改为 user: 表示用户自定义!
会话技术总结:
Seion.save_handler 存储处理器: files|user Seion.save_path 存储地址。Seion.cookie_XXX(lifetime,path,domain,secure,httponly)存储seion-ID这个COOKIE变量的属性
Seion.gc_maxlifetime Seion.gc_probability Seion.gc_divisor
Seion,COOKIE联系和区别?
联系
都是会话技术。
Seion基于COOKIE,seion-ID存储于COOKIE中!
区别:
Cookie
seion 存储位置
浏览器端
服务器端 安全性
低
高 大小限制
有
没有 数据类型
字符串
除资源外的其它全部 有效期使用
长时间存
几乎不做持久化
Seion如何持久化?[理论]
1、Seion-ID要持久化:
2、seion_set_cookie_params(3600);服务器seion数据区有效期修改:ini_set(‘seion.gc_maxlifetime’, 3600);浏览器禁用COOKIE,seion是否可用?[理论] COOKIE被禁用,seion-Id不能存储和传输。不可用!
理论上的解决方案:
通过 URL,或者 POST数据数据向服务器端,每次传输seion-ID!例如下面的配置:php.ini Seion是否仅仅是用COOKIE完成传输seion-ID:
seion.use_only_cookie = 1 开启(在seion_start之前)是否通过其他方式自动传输seion-ID: seion.use_trans_sid = 0 开启
然后通过表单的隐藏域向服务器端,每次传输seion-ID!即可
seion和cookie的额外的一些理解:
1.由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Seion.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Seion,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Seion是保存在服务端的,有一个唯一标识。在服务端保存Seion的方法很多,内存、数据库、文件都有。集群的时候也要考虑Seion的转移,在大型的网站,一般会有专门的Seion服务器集群,用来保存用户会话,这个时候 Seion 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Seion。
2.思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Seion跟踪的,第一次创建Seion的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Seion ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。3.Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。所以,总结一下:
Seion是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Seion的一种方式。