PHP中的會話控制 COOKIE
- httP特點:無連接無狀態
- Cookie: 保存在客戶端中的
內存cookie---有瀏覽器來維護,保存在內存中,瀏覽器關閉後就消失 ,存在時間是有限的
硬盤cookie()保存在硬盤中,有一個過期時間,也可以手動清除瀏覽器數據,否則營辦cookie不會被刪除,存在時間是長期的
Cookie使用場景一般在服務器端設置 可以用在永久登陸、購物車
操作cookie 設置、讀取、更新、刪除cookie
- 設置cookie setcookie()/setrawcookie()
bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = ""[, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
$name設置cookie名稱
$value 設置cookie值 默認爲空
$expire 設置cookie過期時間 默認爲0s
$path 設置cookie有效路徑,默認爲當前目錄及其子目錄,也可以指定爲根目錄及其子目錄
$domin 設置cookie的作用域 默認爲本域
$secure 設置cookie只能通過HTTPs傳輸 默認爲false
$httponly 是否只是用http訪問cookie 默認爲false 如果設置爲true,那麼客戶端就無法使用js操作cookie ,可以減少Xss攻擊
- 讀取Cookie
$_Cookie
- setrawcookie 用法和setcookie一樣 但是不會對發送的值做urlencode編碼 主要是針對加號和空格的編碼
- 更新cookie 重新寫一個setcookie 但是要保證修改前後的$path和$domian保持一致 否則會變爲添加一個新cookie
- 刪除cookie 只要讓cookie過期就可以 但是和更新cookie一樣需要保證$path和$domain 一致
- 通過header方法來設置cookie
Header(“Set-Cookie:name=value[;expires=date][;path=path][;domain=domain][;secure][;httponly]”)
Expires:gmdate(“D,d M Y H:i:s”,time()+3600);
Strtotime(‘+7 days’) 把字符轉爲UNIX時間戳
- 向cookie中存數組
Setcookie(‘userinfo[username]’,’111’,strtotime(‘+1 hour’));
Setcookie(‘userinfo[pwd]’,’222’.strtotime(‘+1 hour’));
- 通過js可以操作cookie
- Explode(‘字符’,’數組’)使用一個字符分割一個數組
Implode(‘字符’,數組)將一個一維數組轉換爲字符串
- json_encode()對變量進行 JSON 編碼
Json_decode()對 JSON 格式的字符串進行解碼
- cookie的缺陷:
- cookie是明文操作。不是很安全。
- 截取cookie可以用來cookie欺騙
- 不要把cookie當作客戶端存儲容器來操作,每個域名允許的cookie是有限制的,每個瀏覽器限制不同。Cookie最大字節數是4K
- Cookie設置後每次請求都會附着再http的頭中,浪費帶寬
- 可以用HTML5的localStorage本地存儲來解決
- localStorage的基礎用法
- localStorage.setItem($name,$value)//設置
- localStorage.getItme($name)//獲取
- LocalStorage.removeImte($name)//移除
- LocalStorage.clear()//清除全部
PHP中的會話控制 session
- 什麼是session:持續性的雙向的連接
服務器和瀏覽器保有的共同的密碼的時間
- 準備建立對話的時候PHP會先查看請求中是否包含session_id,如果沒有服務器會在自己的內存裏新建一個變量,這個變量就是session_id,列如session_1
- 服務器會把session_id發送到客戶端瀏覽器保存,一般瀏覽器會把找個id存在cookie中
- 之後每次瀏覽器再去訪問服務器是都會攜帶cookie中存儲的session_id,這樣這個服務器就認識這個瀏覽器了
- 服務器中的這個session_id變量就可以存放任何會話數據,這些數據是經過序列化處理後存放進去的
- 每次瀏覽器訪問服務器都可以評價自己的session_id到服務器中認領自己的數據
- 如果想要銷會話,可以刪除會話中的數據,銷燬會話文件
- PHP中如何使用session會話
- 開啓session ---- session_start()
可以通過$_SESSION來設置相關值,設置和讀取都是用這個全局變量
- 銷燬session------session_destory()來銷燬
- Session_name()獲取session名稱
Session_id()獲取session_id
- 讓session有生命週期
setcookie(session_name(),session_id(),time()+3600);
- session可以保存數組 直接把數組賦值給$_session
- Cookie禁用後session還能用嘛?答:可以,不過要用url方式傳遞session_name/session_id 然後用session_id($_GET[session_name])來綁定session名和id 就可以正常使用session了
- 徹底銷燬session會話
- 將$_SESSION清空
$_SESSION=[]
- 將cookie中的數據清空 setcookie 讓cookie過期就可以
If(ini_get(‘session.use_cookies’)){ //判斷session是否使用cookie傳遞的
$params=Session_get_cookie_Params();//獲取設置cookie另外選項的一些數組
Setcookie(session_name(),session_id(),time()-1.$params[‘path’].$parms[‘domain’],$params[‘secure’],$params[‘httponly’])
}
//獲取的path爲根目錄下的會話路徑
- 銷燬session
session_destory()
/**
*銷燬對話
*/
$_SESSION="";
session_destroy();
- 自定義形式存儲session----自定義session管理器
最好存在redis內存管理器中
Ini_get()得到php ini配置中的某些數據
Ini_set() 修改php ini 配置中的某些數據
session_set_save_handler ( SessionHandlerInterface $sessionhandler
[, bool $register_shutdown
= true ] ) 設置自定義會話存儲函數,可以將session信息存儲到數據庫中,但是這樣需要在session之前加一臺或者多臺緩存服務器
使用自定義session管理器需要自己寫完Session_set_save_handler 提供的接口,並且在使用前需要將ini配置中的session.save_handler設置爲user--------ini_set(‘session.save_handler’,user)
require_once '實現的接口類';
$obj=new 自定義類;
ini_set('session.save_handler', 'user');
session_set_save_handler($obj,true);
session_start();
//下面寫session操作