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。