CI3的Session的重大改变就是默认使用了原生的Session,这符合Session类库原本的意思,彷佛更加合理一些。整体来讲,虽然设计理念不一样,但为了保证向后兼容性,类库的使用方法与CI2.0的差异不是很大。通常的使用过程是这样的:api
写数据
数组
2 |
$this ->load->library( 'session' ); |
3 |
$this ->session->set_userdata( 'some_name' , 'some_value' ); |
5 |
'username' => 'johndoe' , |
6 |
'email' => 'johndoe@some-site.com' , |
9 |
$this ->session->set_userdata( $newdata ); |
这跟CI2.0几乎没有区别。接下来看读取Session数据的方法。安全
读数据
session
1 |
$name = $_SESSION [ 'name' ]; |
2 |
$name = $this ->session->name ; |
3 |
$name = $this ->session->userdata( 'name' ); |
另一点须要注意,CI3开始,若是返回的数据是空,之前都会置为 FALSE,如今则会 NULL。 因此之前的写法:函数
1 |
$name = $this ->session->userdata( 'name' ); |
须要换成:this
1 |
$name = $this ->session->userdata( 'name' ); |
可使用如下方法判断是否含有某个名称的session:spa
1 |
if ( $this ->session->has_userdata( 'some_name' )){ |
4 |
if (isset( $_SESSION [ 'some_name' ])){ |
删除数据
设计
删除的话则和之前相似:api设计
01 |
unset( $_SESSION [ 'some_name' ]); |
04 |
$_SESSION [ 'some_name' ], |
05 |
$_SESSION [ 'another_name' ] |
08 |
$this ->session->unset_userdata( 'some_name' ); |
10 |
$array_items = array ( 'username' , 'email' ); |
11 |
$this ->session->unset_userdata( $array_items ); |
整体上看,CI3的Session类库设计理念是更加接近原生的函数和方法,同时为了保持向后兼容性,原来的方法也尽可能保留了下来。于此同时,原来的flash data理念作了新的设计,加入了temp data的概念,那么这两个data有什么区别呢?code
flash data 、 temp data 与user data的区别
这三种session数据的名字是CI约定俗成的,指代的内容是不同的,并不存在包含关系。不要错误地认为user data包含flash data或者temp data。在CI的api设计中,分别应用不一样场景:
1. flash data的主要特征是:保存的数据是一次性数据,在下次请求中用过一次就没了。本质上讲,flash data跟普通的session数据无异,CI不过是对该类data的名称作出了特殊标记,保证了它们拥有了只能用一次的特征,因此你可使用如下方法将 普通的user data标记为flash data:
1 |
$_SESSION [ 'item' ] = 'value' ; |
2 |
$this ->session->mark_as_flash( 'item' ); |
3 |
$this ->session->mark_as_flash( array ( 'item' , 'item2' )); |
5 |
$this ->session->set_flashdata( 'item' , 'value' ); |
flash data的适用场景是:将操做结果返回到下一次请求的页面上。好比有个保存操做,提交后会跳转到一个新的页面,你可使用flash data保存一句话“保存已成功”,该句话只在跳转的页面显示一次,再次刷新跳转页面,就不会显示了。
2. temp data的主要特征是: 保存的数据在规定的时间内有效,它的生命期由方法$this->session->set_tempdata('item', 'value', 300)设置,其中的300意思是该session数据的有效期为5分钟,超过规定时间(即使是session还没过时)就会失效,它的时效性介于 flash data 和user data 之间。它和flash data在本质上是相似的,也能够从普通的session转化过来:
01 |
$_SESSION [ 'item' ] = 'value' ; |
02 |
$this ->session->mark_as_temp( 'item' , 300); |
03 |
$this ->session->mark_as_temp( array ( 'item' , 'item2' ), 300); |
05 |
$this ->session->mark_as_temp( array ( |
10 |
$this ->session->set_tempdata( 'item' , 'value' , 300); |
temp data的适用场景是:保存一些更加细粒度的、更加隐私的session数据。好比某些令牌token,比较重要,为了安全让它的生命期更短一些,能够保证安全。temp data的设计从某种方面保证了session拥有不一样生命期的数据。
3. user data的主要特征是:保存的数据在session有效期内均有效,它的生命期由sess_expiration设置,通常默认是7200s,并且它也是生命期最长的。
flash data 、 temp data 与user data的读取
CI Session类中的flash data、temp data与user data,都能以$_SESSION['item'] 的方式获取到。同时又可以使用各自的方法获取到:
01 |
echo $_SESSION [ 'item' ]; |
03 |
$this ->session->flashdata( 'item' ); |
04 |
$this ->session->flashdata(); |
06 |
$this ->session->tempdata( 'item' ); |
07 |
$this ->session->tempdata(); |
09 |
$this ->session->userdata( 'item' ); |
10 |
$this ->session->userdata(); |
可是要注意:这几种数据是分割开来的,不能使用$this->session->userdata('item'),去访问一个设为flash data的数据:
1 |
$this ->session->set_tempdata( 'item' , 'value' , 300); |
2 |
$this ->session->userdata( 'item' ); |
4 |
$this ->session->set_flashdata( 'item2' , 'value' ); |
5 |
$this ->session->userdata( 'item2' ); |
Session数据的删除与销毁
session数据的删除能够理解为细粒度的删除某个session数据,可使用:
1 |
$this ->session->unset_userdata( 'item' ); |
2 |
$this ->session->unset_tempdata( 'item' ); |
4 |
unset( $_SESSION [ 'item' ]); |
session销毁,则会使全部数据类型失效,包括flash data 和temp data:
3 |
$this ->session->sess_destroy(); |
扩展内容:flash、temp及user data的设计思路
首先,三种类型的数据一定存在了$_SESSION超级变量中,也就是说使用set_tempdata()和set_flashdata()方法,都会把 对应的名称加入到$_SESSION超级变量中。不过这还没完,CI会用一个叫__ci_vars的session数据来区分flash 、temp与user data的不一样。
1 |
$_SESSION [ '__ci_vars' ] = array (); |
使用set_flashdata('item', 'value')时,除了$_SESSION['item'] = 'value'; 同时会有:
2 |
$_SESSION [ 'item' ] = 'value' ; |
5 |
$_SESSION [ '__ci_vars' ][ 'item' ] = 'new' ; |
而使用set_tempdata('item2', 'value', 300)时,也是相似,不过略有区别:
2 |
$_SESSION [ 'item2' ] = 'value' ; |
6 |
$_SESSION [ '__ci_vars' ][ 'item2' ] = 13789020340; |
当使用这些不一样类型的数据时,CI首先看$_SESSION是否含有这个key,而后会根据$_SESSION['__ci_vars']数据包中key 对应的值来判断,简单地说,就是看对应的值是否是int类型。若是是,就认为是temp data;若是不是,则认为是flash data。因此,你可使用$_SESSION()方法得到全部类型的数据,也可使用unset方法,删除掉全部类型的数据。
设置完flash data和temp data的下次请求时,构造函数都会判断$_SESSION['__ci_vars']中的特定数据,若是值为‘new’的,则置为‘old’;若是值是数字,则跟当前的时间戳比较,小于的话,则会删除该key下的数据。
再次请求时,flash data中置为‘old’的数据自动被删除,没法再次读取,temp data中的key已通过期删除,取值为NULL。