session相关重点知识

上一篇 / 下一篇  2012-08-27 16:19:54

Session直接翻译成中文比较困难,一般都译成时域。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间以及如果需要的话,可能还有一定的操作空间。

  具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。

  需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的SessionB用户和C服务器建立连接时所处的Session是两个不同的Session

  session工作原理

  (1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。

  (2)首先使用session_start()函数,PHPsession仓库中加载已经存储的session变量。

  (3)当执行PHP脚本时,通过使用session_register()函数注册session变量。

4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。

 

 

Session的解决方案

  那什么是Session的解决方案呢?我们知道,用户访问一个网站时往往需要浏览许多网页。对于一个通过PHP构筑的网站来说,用户在访问的过程中需要执行许多的PHP脚本。然而由于HTTP协议自身的特点,用户每执行一个PHP脚本都需要和Web服务器重新建立连接。

  又由于无状态记忆的特点,此次连接无法得到上次连接的状态。这样,用户在一个PHP脚本中对一个变量进行了赋值操作,而在另外一个PHP脚本中却无法得到这个变量的值。例如,用户在负责登录的PHP脚本中设置了$user="wind",却无法在另一个PHP脚本中通过调用$user来获得“wind”这个值。也就是说,在PHP中无法设置全局变量。每个PHP脚本中所定义的变量都是只在这个脚本内有效的局部变量

  Session解决方案,就是要提供在PHP脚本中定义全局变量的方法,使得这个全局变量在同一个Session中对于所有的PHP脚本都有效。上面我们提到了,Session不是一个简单的时间概念,一个Session中还包括了特定的用户和服务器。因此更详细地讲,在一个Session定义的全局变量的作用范围,是指这个Session所对应的用户所访问的所有PHP

  例如A用户通过Session定义了一个全局变量$user=wind”中,而B用户通过Session定义的全局变量$user=jane”。那么在A用户所访问的PHP脚本中,$user的值就是wind

 

 

1Session周期

  新的浏览器窗口启动后,开始一个新的Session,触发GlobalSession_Start的调用,从第一个浏览器窗口打开的浏览器窗口不 启动新的SessionSession过期后,执行页面的提交也会触发Session_Start,等于是新的一个Session

2,调用Session

  对于Web Service,每个方法的调用都会启动一个Session,可以用下面的方法来使多个调用在同一个SessionCWSSyscfg cwsCfg = new CWSSyscfg(); cwsCfg.CookieContainer = new System Net.CookieContainer(); CWSSyscfg是一个Web Service类,Web Service的给代理类设置CookieContainer属性,只要多个代理的CookieContainer属性是相同的值,则对这些Web Service的调用在同一个Session。可以用单例模式来实现。

3Session数据有效期

  只要页面有提交活动,则Session的所有项都会保持,页面在20分钟(默认配置)内没有任何提交活动时Session会失效。Session内存储的多个数据项是整体失效的。

4Session的保存

  在Session中如果保存的是非序列化的类比如DataView,在用SQLServer保存Session的模式下,无法使用。查看一个类是否是序列化的方法是,需看是否用[Serializable]来标记了该类.

 

 

php中的SessionCookie

  在PHP开发中对比起Cookiesession是存储在服务器端的会话,相对安全,并且不像Cookie那样有存储长度限制,本文简单介绍session的使用。

  由于Session是以文本文件形式存储在服务器端的,所以不怕客户端修改Session内容。实际上在服务器端的Session文件,PHP自动修改session文件的权限,只保留了系统读和写权限,而且不能通过ftp修改,所以安全得多。

  对于Cookie来说,假设我们要验证用户是否登陆,就必须在Cookie中保存用户名和密码(可能是md5加密后字符串),并在每次请求页面的时候进行验证。如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为我们并不能只做一次验证。为什么呢?因为客户端Cookie中的信息是有可能被修改的。假如你存储$admin变量来表示用户是否登陆,$admintrue的时候表示登陆,为false的时候表示未登录,在第一次通过验证后将$admin等于true存储在Cookie,下次就不用验证了,这样对么?错了,假如有人伪造一个值为true$admin变量那不是就立即取的了管理权限么?非常的不安全。

  而Session就不同了,Session是存储在服务器端的,远程用户没办法修改session文件的内容,因此我们可以单纯存储一个$admin变量来判断是否登陆,首次验证通过后设置$admin值为true,以后判断该值是否为true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。而且可以减少每次为了验证Cookie而传递密码的不安全性了(session验证只需要传递一次,假如你没有使用SSL安全协议的话)。即使密码进行了md5加密,也是很容易被截获的。

  当然使用session还有很多优点,比如控制容易,可以按照用户自定义存储等(存储于数据库)。我这里就不多说了。

  sessionphp.ini是否需要设置呢?一般不需要的,因为并不是每个人都有修改PHP.ini的权限,默认session的存放路径是服务器的系统临时文件夹,我们可以自定义存放在自己的文件夹里,这个稍后我会介绍。

 

 

Session能否像Cookie那样设置生存周期呢?有了Session是否就完全抛弃Cookie?我想说,结合Cookie来使用session才是最方便的。

  Session是如何来判断客户端用户的呢?它是通过Session ID来判断的,什么是Session ID,就是那个Session文件的文件名,Session ID是随机生成的,因此能保证唯一性和随机性,确保Session的安全。一般如果没有设置Session的生存周期,则Session ID存储在内存中,关闭浏览器后该ID自动注销,重新请求该页面后,重新注册一个session ID

  如果客户端没有禁用Cookie,则Cookie在启动Session会话的时候扮演的是存储Session IDsession生存期的角色。

 


TAG:

 

评分:0

我来说两句

日历

« 2024-03-19  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 9952
  • 日志数: 22
  • 建立时间: 2012-07-05
  • 更新时间: 2012-09-27

RSS订阅

Open Toolbar