由來php
瀏覽器和服務器間的數據交互,就是會話。 可是呢,http協議是無狀態無記憶的,就會致使業務的不連續性。 [不連續性的說明]譬如你在xxx網站A界面登陸成功,當你點擊跳轉到B界面時,又會提示請登陸。 那麼,怎麼才能讓服務器識別瀏覽器身份,認爲是同一用戶的屢次請求,從而達到數據共享呢? 這就要用到[會話技術]了,本質上就是數據持久化存儲。 會話技術,就是來解決http協議缺陷而致使的業務不連續問題。 相關補充:cookie在瀏覽器端的存儲,是有數據量限制的,通常是4k; 而前端本地存儲技術可彌補,譬如: localStorage (20M) 本地存儲 只要用戶不手動刪除,就一直存在 應用場景:記住皮膚;瀏覽歷史搜索;回到上一次離開的位置等 sessionStorage (5M) 會話存儲 瀏覽器關閉就沒了 應用場景: 單頁面應用間數據的傳遞 可能存儲在瀏覽器或硬盤上。 會話技術,從保存位置上有所區分: 持久化存儲在服務端,是session 持久化存儲在客戶端,是cookie
cookie過程分析前端
瀏覽器請求XXX網站服務器後,服務器把數據存儲在瀏覽器的cookie中; 後來的每次請求,瀏覽器都會攜帶該網站內全部的cookie做爲身份,由服務端腳原本識別處理。 固然,這一過程是基於瀏覽器執行的。同一網站在不一樣的瀏覽器間存儲的cookie是不能共享的。 cookie默認是會話週期,即從瀏覽器打開,請求服務器資源,到關閉瀏覽器這一過程。 cookie因存儲在客戶端而有安全性的問題,且每次請求都會攜帶全部的cookie內容。
使用算法
/*cookie*/ //存儲的數據類型,通常是字符串 //格式說明(未展現全部參數,有興趣的可查手冊) setcookie('數據名','數據值','有效期','有效路徑','有效域名'); // 特例: // PHP_INT_MAX 永久有效 // / 默認是當前目錄及子目錄有效,我這裏改爲了整站有效 // .6758591.com 默認是當前域名,我這裏改爲了跨子域 setcookie('age',18,PHP_INT_MAX,'/','.6758591.com'); // 增 setcookie('name','Lin'); // 刪 setcookie('name','',0); setcookie('name','',time()-1); // 改 setcookie('name','Bin'); // 查 echo $_COOKIE['name'];
查看(方式不少,擇其一)windows
session過程分析瀏覽器
瀏覽器,首次請求xxx網站服務器後,服務端因session_start()而當即建立新的session文件; 文件名默認格式,示例: sess_0l4jphu0c88lm1ka6242po5763 sess_是前綴,後面的字符串是特殊算法生成的具備「惟一隨機性」的串兒; 後經過http協議的響應頭,setcookie去回傳PHPSESSID=0l4jphu0c88lm1ka6242po5763; 瀏覽器收到響應內容後,將PHPSESSID做爲身份信息,保存在cookie,默認是會話週期. 後來的每次請求都會,攜帶全部的cookie信息(包括身份信息)提交給服務器腳本; 服務端收到請求後,比對查找是否有對應的session文件; 若是有的話,則讀取到超全局變量$_SESSION中; 不然會新建session文件,以進行$_SESSION操做. 備註:session文件也不是一直存在於服務端的,默認存活時間是24min。 默認以文件形式存儲,也可存儲在DB中.但讀取操做仍是要消耗服務器資源的。 由php.ini中可的相關參數決定存活時間、啓動gc的概率、session_name命名及存儲位置等。
使用安全
/*session*/ //存儲的數據類型,幾乎支持php的全部數據類型 //當前頁面開啓session會話機制.(只要用到的頁面,就必定要首先開啓.) session_start(); //增/改 $_SESSION['name'] = 'Lin'; //刪 unset($_SESSION['name']); //刪除單個session數據 $_SESSION = []; //刪除所有session數據 session_destroy(); //連session文件都銷燬了 // 查 echo $_SESSION['name'];
查看(windows下本地服務器,且未修改php.ini中相關配置參數時)服務器
若是禁用了cookie,那麼session如何使用cookie
cookie和session本質上都能以數據持久化存儲的方式解決身份識別問題,那麼cookie被禁掉後,本地就沒有瀏覽器身份信息隨着請求發到服務器了,服務器天然就不能識別,從而不斷的生成新的session文件。這是不可取的。 解決的關鍵是,要確保對同一個session文件的操做。那麼在sesion_start()前就得指定session_id();