hp网络访问会话管理.ppt
网络访问会话管理,课程内容,课程内容会话管理的解决方案方案一使用Session方案二使用Cookie购物车系统,会话管理的解决方案,网站交互应用要求服务器能够记忆、区分每个客户端的身份及信息,在Web服务器端编程中,会话状态管理是一个很重要的方面。HTTP是一种无状态(Stateless)的协议,它无法区分当前的一连串请求是来自相同的客户端还是不同的客户端,或者客户端是处于连接状态还是断开状态。再如通过在线商店购物时,由于服务器不能记住以前的事务,当我们把商品加入购物车时,服务器不知道购物车里原先有些什么,不能记住客户都买了什么商品,因此购物车的功能将无法实现。,各种会话跟踪技术,隐藏表单域,URL重写,会话管理的解决方案Session与Cookie,那么如何才能实现会话状态呢?在PHP中,通常有以下两种解决方案:Session:中文翻译为“会话”,指用户访问网页到与服务器断开连接的一个时间段。Session的功能是跟踪用户状态,存储整个会话过程中保持其状态的信息。Cookie:Cookie是一个小文本文件,该文件里面记录了会话信息并存储在客户端。,方案一使用Session,Session简介Session的创建与销毁Session的配置与应用Session中的存取对象与应用数组Session的共享提高Session的效率,Session简介,Session是什么呢?通常在中文里翻译为“会话”。由于网页是一种无状态的连接程序,因此无法得知用户的浏览状态。所以我们必须通过Session来记录用户的有关信息,以供用户再次以此身份对Web服务器提供要求时作确认。Session其实指的就是访问者从到达某个特定主页到离开为止的那段时间。每一访问者都会单独获得一个Session。在Web应用程序中,当一个用户访问该应用时,Session类型的变量可以供这个用户在该Web应用的所有页面中共享数据;如果另一个用户也同时访问该Web应用,他也拥有自己的 Session变量,两个用户之间无法通过Session变量共享信息。,Session简介,在PHP中,Session由一种能够存储用户发出的请求状态信息的方法组成。当用户每次访问网站时,都会为每个访问者创建一个唯一的标识符来区分客户的身份,这个标识符被称为会话ID(SID)。其实SID就是Session 文件的文件名,具有唯一性和随机性,以确保Session 的安全。若客户端未禁用Cookie,SID存储在Cookie(称为会话Cookie)中,否则使用URL来传递SID。,使用Session的过程,启动Session注册Session调用Session关闭Session,使用session函数概览,session_start();/初始化session.需在文件头部$_SESSIONname=value;/配置Seeeionisset($_SESSIONname);/判断echo$_SESSIONname;/使用sessionunset($_SESSIONname);/删除会话变量session_destroy();/删除所有session,Session的创建与销毁,在PHP5中,使用session_start()函数来创建一个会话状态,同时意味着会话的开始,session_start()函数的语法格式:如果拥有会话ID,session_start()函数将会继续当前会话,否则创建一个新会话,并为用户会话分配一个会话ID。开始一个会话之后,可使用PHP5的超级全局变量数组$_SESSION来存储和取回Session中的变量。,Session的创建与销毁,尽管断开与服务器的连接或者时间过期可自动销毁会话,但是有时是需要手工来销毁会话的,此时可使用session_unset()或session_destroy()函数。其中session_unset()函数的语法格式:session_unset()函数用于释放指定的Session变量,它不会完全删除会话,用法:session_destroy()函数会完全删除当前会话,它的语法格式:使用session_destroy()函数以后,当前会话将会失效,用法:,使用Session的方法,除了使用函数来注册Session之外,还可以直接给Session变量的方法来使用Session。其使用格式如下所示:$_SESSIONkey=value;其中的key为需要进行定义的Session键名,value为对其所赋的值。在注销时需要使用函数:unset()。注意,只需要把指定变量作为参数即可,如:unset($_SESSIONname)。而不需要把$_SESSION作为参数,因为这样将把所有Session全部注销。,不鼓励使用的函数,注意:session_register(),session_unregister,session_is_registered在php5下不再使用,Session的配置与应用,在使用会话时,大部分控制都是由PHP的配置文件来完成的。PHP5共提供了25个会话配置指令负责会话处理功能,其中重要的23个有:1session.save_handler:该指令定义了存储和获取与会话相关联数据的处理器的名称,它可接受的参数有4个,分别为:files:文件,默认值为files。mm:共享内存。sqlite:SQLite数据库。user:用户自定义函数。,2session.save_path;该指令定义了传递给存储处理器的参数,如果处理器名为 files,则参数值为创建文件的路径。session.save_path指令的默认值为“/tmp”。在php.ini文件中,session.save_path指令还可以使用这种形式:session.save_path=N;/path可选参数 N用来决定会话文件分布的目录深度,其值为一个整数。需要注意的一点是要使用参数N,必须先创建好这些目录。,Session的配置与应用,3session.use_cookies:该指令用来决定是否在客户端使用 cookie 来存放会话 ID,它接受两个值,分别为:1:表示启用,默认值为1。0:表示禁用。4session.use_only_cookies:会话ID与某个用户相关联可通过两种途径,一种是使用Cookie,另一种使用URL传递。session.use_only_cookies指令用来决定是否在客户端只使用Cookie来存放会话 ID,而放弃使用URL传递。session.use_only_cookies指令接受两个值,分别为:1:表示只使用Cookie,默认值为1。0:表示同时使用Cookie和URL传递。当session.use_only_cookies指令的值设置成1时,可防止有关通过 URL 传递会话 ID 的攻击。,Session的配置与应用,5session.name:该指令用于指定发送到客户端的会话Cookie名,默认值为PHPSESSID。6session.auto_start:该指令用于指定是否在请求开始时自动启动一个会话,它接受两个值,分别为:1:表示在请求开始时自动启动一个会话。0:不会自动启动一个会话,需要用session_start()函数显式的启动,默认值为0。7session.cookie_lifetime:该指令指定了发送到浏览器的会话Cookie的生命周期,单位为秒,默认值是0。当值是0时,表示会话Cookie的生命周期直到浏览器被用户关闭为止。8session.cookie_path:该指令指定了会话 cookie 的有效路径,默认值为“/”。当值是“/”表示Cookie对当前网站下的所有路径都是有效的,若值为“/item”,则表示会话cookie只在网站下的item路径中才是有效的。,Session的配置与应用,9session.cookie_domain:该指令指定了会话Cookie的有效域,默认值为空。使用这个指令可防止别的域非法读取自己的会话Cookie,以增强Cookie的安全性。若session.cookie_domain指令的值为空,表示将根据 Cookie规范生成Cookie的主机名。10session.cookie_secure:该指令决定是否仅使用安全连接(https)来发送Cookie,默认值为off。11session.serialize_handler:该指令定义了序列化和逆序列化的处理器名,默认值为php(php是标准序列化和逆序列化处理器)。此外,PHP若启用了WDDX(Web开发数据交换)支持,还可使用wddx处理器。12session.gc_probability和session.gc_divisor:session.gc_probability指令和session.gc_divisor指令合起来定义在每次初始化会话时,启动垃圾回收程序的概率。其中session.gc_probability指令作为分子部分,默认值为1。session.gc_divisor指令作为分母部分,默认值为100。,Session的配置与应用,13session.gc_maxlifetime:该指令指定了过多长时间数据被视为“垃圾”并由垃圾回收程序清理,单位为秒,默认值是1440。它的判断依据是最后访问数据的时间,对于FAT文件系统则是最后修改数据的时间。如果多个脚本共享同一个session.save_path目录,将以所有session.gc_maxlifetime指令中的最小值为准。14session.referer_check:该指令用来验证HTTP Referer中是否包含指定的字符串,如果包含则会话ID被视为有效,若不包含则会话ID将视为无效。它的默认值为空,表示全部视为有效。15session.bug_compat_42和session.bug_compat_warn:PHP 4.2.3以及之前的的版本有一个未注明的特性或者BUG,它允许用户在 register_globals 被禁用的情况下也可以初始化全局Session变量,如果在PHP4.3以及更新版本中使用这个特性,并且同时开启了session.bug_compat_42和session.bug_compat_warn指令会显示警告信息。session.bug_compat_42和session.bug_compat_warn的默认值都为1,表示开启。,Session的配置与应用,16session.entropy_file:该指令来指向提供一个外部资源(文件),该资源(文件)会集成到会话ID的生成过程中。session.entropy_file指令的默认值为空。17session.entropy_length:该指令指定了从外部资源(文件)读取的字节数。默认值为0,表示禁用。18session.cache_limiter:该指令指定了会话页面所使用的缓冲控制模式,以此决定客户端和中间代理如何缓存页面内容。它接受五个值,分别为:nocache:表示无缓存,禁止客户端和中间代理缓存页面。默认值为nocache。none:阻止在HTTP头中发送禁用缓存的命令。public:客户端和中间代理都可缓存页面private:客户端可缓存页面,中间代理禁止缓存页面。private_no_expire:在private模式下,一些浏览器不能正确处理expire 头,使用private_no_expire就可以解决这个问题。在private_no_expire模式下,expire头将不会往客户端发送。,Session的配置与应用,19session.cache_expire:该指令指定了会话页面在客户端cache中的有效时间,单位是分钟,默认值为180。当缓存模式为nocache时,此指令无效。20session.use_trans_sid:该指令确定在URL中传递会话ID时是否使用明码显示,默认值为0,表示禁止使用。设置成1,表示允许使用。21session.hash_function:该指令指定了生成会话ID的散列算法,它接受两个值:1:代表使用SHA-1(160 位)算法。0:代表使用MD5(128 位)算法。默认值为0。,Session的配置与应用,22session.hash_bits_per_character:当会话ID由二进制散列数据转换成可读的字符串格式时,session.hash_bits_per_character指令指定了每个字符存放多少个bit,它接受3个值,分别为:4:代表转换以后得到一个由0-9和a-f组成的32字符长的字符串。默认值为4。5:代表转换以后得到一个由0-9和a-v组成的26字符长的字符串。6:代表转换以后得到一个由0-9、a-f、A-Z、“-“和“,“组成的22字符长的字符串。23url_rewriter.tags:当session.use_trans_sid 指令处于启用状态时,使用url_rewriter.tags指令可指定重写哪些 HTML 标签来加入会话ID。其默认值为“a=href,area=href,frame=src,input=src,form=,fieldset=“。,Session 中的存取对象与应用数组,在PHP5之前的版本,会话只能处理一些简单数据类型,比如整型、字符串、浮点型等。自PHP5版本开始,引进了对象串行化机制,PHP开始允许在Session中存取对象。在Session中存取对象的优点就是可把大量数据存放在一个对象中,利用Session可容易的实现在不同的页面间进行大量数据的传递。,Session 的共享,通常情况下,一个大型网站往往要架设多台服务器以运行不同功能的模块。根据Session的实现原理可知,在默认情况下,PHP 的Session数据都是分别以文本形式保存在当前服务器下。再者,各个服务器会各自分别对同一个客户端生成 SID,如对于同一个用户,A 服务器产生的 SID 是ef024a7b15365e156a6ce8b8819e747c,B服务器生成的则是3c3faf23b5b3c2a516ceffa69df229b0鉴于上面两种情况,当同一个用户访问网站的的不同模块时,会因为SID的不同和Session数据不能相互访问而给用户带来一些不必要的麻烦,比如由一个网页转到另一个网页时需要重新登录等等。,Session 的共享,如何才能实现Session的共享呢?首先是保证每个服务器对同一个客户端产生相同的SID,并且可通过同一个Cookie 进行传递,即每个服务器必须可以读取同一个名为 PHPSESSID 的Cookie,其次就是共享Session文件中的数据。要使各个服务器共享同一客户端 SID,需要对Cookie 的域(domain)进行一定的设置,默认情况下,Cookie 的域是当前服务器的域名或者IP地址,但是对同一个网站而言,它的各个服务器是属于同一个一级域的,如:http:/都属于域,因此,我们就可以在配置文件php.ini中做如下的配置:session.cookie_domain=这样http:/等都能访问到当前Cookie了。,Session 的共享,SID的问题解决后,另一个就是Session文件的共享了。我们可选择使用数据库来保存 SESSION 数据,这样各个服务器就可以方便地访问同一个数据源,获取相同的 SESSION 数据了。我们已经知道,默认情况下PHP 的Session数据都是以文本形式保存的,若使用数据库存储,则需要修改session.save_handler指令的值,在php.ini文件中对session.save_handler指令的配置如下:session.save_handler=user,由于将session由默认的分散文件管理变成了自定义的数据库管理,就有了增强session功能的手段控制一个帐号只能一个人登录统计在线人数踢出某个在线用户多站点共享session(网络通行证)实现Application变量(多用户共享的全局变量).,方案二使用Cookie,Cookie简介Cookie的工作原理创建与删除Cookie解决Cookie中常见的问题,Cookie简介,Cookie是指某些网站为了辨别用户身份而储存在用户本地终端上的数据,它以小文本文件的形式存储在客户端。Cookie中可以包含有关用户的信息,如身份识别号码、密码、用户在Web站点购物的方式或用户访问该站点的次数等。无论用户何时连接到服务器,Web站点都可以访问Cookie信息。Cookie按其种类的不同可以分为临时Cookie和永久Cookie。临时 Cookie又称为会话 Cookie,它仅为当前浏览的对话存储,一旦超过规定的时间或者关闭 Internet Explorer 时就会被系统清除。永久 Cookie 以文件形式存储在计算机上,关闭 Internet Explorer 时仍然保留在计算机上。再次访问该站点时,创建该 Cookie 的网站仍然可以对它进行调用。,Cookie简介,通常,对于Windows2000和WindowsXP操作系统,Cookie文件保存在“C:Documents and Settings用户名Local SettingsTemporary Internet Files”路径下,文件名组成为usernamedomainname,其中username为登录网站的用户名,domainname为网站的域名。因为Cookie存储在用户的计算机上,因此它们可能会带来一定的安全问题,许多浏览都提供了对Cookie的灵活性控制功能,甚至还可以屏蔽掉Cookie。但是Cookie也并非不安全,这取决于编程人员对Cookie的正确使用,而且,如果完全禁止了Cookie,就再也无法使用许多网站的某些功能了,Cookie的工作原理,Cookie是HTTP header的一部分,Cookie通过HTTP Headers从服务器端返回到浏览器上,服务器端在响应中利用Set-Cookie header来创建一个Cookie,浏览器在它的请求中通过Cookie header包含这个已经创建的Cookie,并且让它返回至服务器,从而完成浏览器的认证。例如,我们创建了一个名字为login的Cookie来包含访问者的信息,创建Cookie时,服务器端的Header 如下面代码所示,这里假设访问者的注册名是“Michael Jordan”,同时还对所创建的Cookie的属性如path、domain、expires等进行了指定。Set-Cookie:login=Michael Jordan;path=/;domain=;expires=Monday,01-Mar-99 00:00:01 GMT上面这个Header会自动在浏览器端计算机的Cookie文件中添加一条记录。浏览器将变量名为“login”的Cookie赋值为“Michael Jordon”。注意:在实际传递过程中这个Cookie的值是经过了URLEncode方法的URL编码操作的。这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器将Cookie通过请求以忽略路径的方式返回到服务器,完成浏览器的认证操作。,Cookie的工作原理,此外,我们使用了Cookie的一些属性来限定该Cookie的使用。例如Domain属性能够在浏览器端对Cookie发送进行限定,具体到上面的例子,该Cookie只能传达到指定的服务器上,而决不会跑到其它的如的Web站点上去。Expires属性则指定了该 Cookie保存的时间期限,例如上面的Cookie在浏览器上只保存到1999年3月1日1秒。当然,如果浏览器上Cookie 太多,超过了系统所允许的范围,浏览器将自动对它进行删除。至于属性Path,用来指定Cookie将被发送到服务器的哪一个目录路径下。浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其它网站的请求Cookie是绝对不会跟着发送的。而且浏览器会这样一直发送,直到Cookie过期为止。,使用cookie的过程,创建cookie调用cookie删除cookie,Cookie详解,PHP100视频教程,2、Cookie的配置与应用,Setcookie(string name,string value,int expire,string path,string domain,int secure);,其中name是cookie变量名称标识,你在php中将能象使用普通变量名相同来用他引用cookie变量。value是cookie变量的初始值,expire 表示该cookie变量的有效时间;path 为该cookie变量的相关路径;domain 表示cookie变量的网站;secure 则需在 https 的安全传输时才有效。,创建与删除Cookie,在PHP中创建Cookie是使用setcookie()函数实现的,该函数的语法格式如下:,Setcookie(string name,string value,int expire,string path,string domain,int secure);,例:,SetCookie(Cookie,cookievalue,time()+3600,/forum,1);,毫秒time()+3600=1小时,保存路径,保存的域,HTTPS,名称,必须,值,必须,引用Cookie,注册Cookie后,就可以引用所注册的Cookie。PHP中有一个自动全局变量$_COOKIE。该变量为用户已经注册的Cookie数组。而调用相关的Cookie值就是调用该数组元素。具体操作如下:如果已经定义了一个名为:user的Cookie值。则在调用时就使用$_COOKIEuser这样的形式即可。,删除Cookie,通常情况下在创建Cookie时,如果为Cookie指定了过期时间,Cookie会在过期时间后自动销毁,但是有时候用户希望能手动删除Cookie。删除Cookie非常的简单,只需创建一个同名的Cookie,并将其值设置为空即可。1、SetCookie(Cookie,);2、SetCookie(Cookie,value,time()-1);,解决Cookie中常见的问题,1浏览器对Cookie的支持大多数浏览都提供了对Cookie的灵活性控制功能,而且有的用户为了安全,会将Cookie在浏览器中屏蔽掉,因此在程序中应检测浏览器是否提供了对Cookie的支持。2.在创建Cookie前输出HTML文件内容在使用Cookie时,一条常见的警告信息如图:出现这条警告信息的原因是因为在调用setcookie()函数之前,有HTML文件的内容输出,因此,在创建Cookie时应确保在此之前无任何输出。3Cookie的限制一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个Web站点能设置的Cookie总数不能超过20个。,Cookie与Session的区别与联系,Session与Cookie的共同点为:二者都同为会话处理机制,都可以用来存私密的东西,也同样也都有有效期的概念。,Cookie数据存放在客户端,Session数据放在服务器上。Cookie不是很安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗。而Session由于保存在远程服务器上,相对比较安全。由于Session会在一定时间内保存在服务器上。当服务器的访问增多时,会占用服务器的性能。考虑到减轻服务器性能方面,应当使用Cookie。单个Cookie在客户端的限制是3K,就是说一个站点在客户端存放的Cookie不能超过3K。而Session则没有这方面的限制。Cookie的使用与浏览器的设置有关,如果用户禁用了Cookie则所有基于Cookie的应用都将失败。而Session则与客户端的配置无关,所以不必关心客户端的配置情况。,会话管理的应用范围,用户身份认证程序状态记录,运用于工作流页面之间参数传递,运用于多页表单,购物车系统,购物车是网络商城中一个非常重要的工具,它和现实中超市的购物车功能类似,当用户在网站上浏览不同的商品时,若发现自己喜爱的商品,单击【加入购物车】,该商品就会放入购物车中,单击【继续购物】,可重复选购商品,最后将选中的所有商品放在购物车中统一到付款台结账。实现购物车的前提条件是必须让服务器记住是谁在购买商品,以及当把商品加入购物车时,需要知道购物车里原先存放的商品。虽然HTTP是一种“无状态”的协议,但是PHP提供的Session则可以保存和跟踪用户的状态信息。,购物车系统功能演示,1显示商品信息在显示商品信息的页面中,用户可一次性选购多种商品,单击【加入购物车】,就会将自己选购的商品放入购物车中。,购物车系统功能演示,2显示购物车中的商品在购物车中,可显示用户选购的所有商品和商品的总数量,同时单击【继续购物】链接,则页面跳转到显示商品信息页面,用户可继续购买商品。,