session與cookie是什麼?
session與cookie屬於一種會話控制技術.經常使用在身份識別,登陸驗證,數據傳輸等.舉個例子,就像咱們去超市買東西結帳的時候,咱們要拿出咱們的會員卡纔會獲取優惠.這時候,咱們怎麼識別這個會員卡真實有效的呢?當咱們將會員號給到收銀員,收銀員根據咱們提供的會員號,輸入到系統中,系統根據這個會員號去查詢,若是查詢到了就證實這個會員號是真實存在的.這裏的會員號就比如cookie與session.會員系統就比如服務器端,收銀員就比如客戶端.php
爲何會用到session與cookie呢?
根據上述的例子,咱們知道session與cookie是能夠幹什麼的了,那爲何必須用這個來實現呢?這裏就有必要了解一下http應用傳輸協議的特色了。因爲http協議是無狀態的,即瀏覽器去請求了一個網頁,這時候就是一個http請求,當服務端接收到請求以後,返回客戶端須要的數據,在這過程當中瀏覽器與服務器是創建了一個鏈接的。可是當服務端返回數據,客戶端收到數據以後,他們的這種鏈接關係就斷開了。下次瀏覽器再去發送請求的時候,又是從新創建一個鏈接,這兩個連接沒有任何關係。試想一下,當咱們登陸一個商場系統的時候,進入首頁作了登陸操做,可是咱們下單或者加入購物車的時候,還須要登陸,每訪問一個頁面就要登陸,是否是很繁瑣同時也是很不科學的,萬一咱們加入購物車的商品,咱們點擊下單了,下單頁面要登陸並且還沒法正確的反饋出你下單時的那些商品.html
1.http協議支持客戶端/服務端模式,也是一種請求/響應模式的協議。
2.無鏈接。所謂的無鏈接就是服務器收到了客戶端的請求以後,響應完成並收到客戶端的應答以後,即斷開鏈接。限制每次的鏈接只處理一次請求。從而節省傳輸時間。
3.無狀態。http協議對事務的處理沒有記憶能力。也就意味着若是須要前面的信息,只能重傳,這無形之中增長數據的傳輸量。這種方式某種方面上講解放了服務器,可是卻不利於客戶端與服務器的鏈接。爲了彌補這種不足,產生了兩項記錄http狀態的技術,一個叫作Cookie,一個叫作Session,後面咱們再細講它們。
4.簡單快捷:所謂的簡單快捷是指客戶端向服務器請求服務時,通常來講只須要傳輸請求方法和路徑,就能進行訪問
5.靈活:這裏主要指的是客戶端能夠經過http協議傳輸任意類型的數據。好比傳輸.jpg文件、.ppt文件等等,只須要設定content-type就能夠進行傳輸。前端
cookie的基本概念
cookie是遠程瀏覽器存儲數據以此追蹤用戶和識別用戶的的機制,從實現來講,cookie是存儲在客戶端上的一個數據片斷。web
cookie的運行原理與存儲機制
.運行原理
1.客戶端向服務端發起一個http請求.
2.服務端設置一個建立cookie的指令,響應給客戶端.
3.客戶端收到服務端響應的指令,根據指令在客戶端建立一個cookie.
4.擋下一次請求時,客戶端攜帶這個cookie向服務端發送請求.
.存儲機制
總的來講,cookie在客戶端存儲的形式有三種,不一樣的瀏覽器的存儲機制不一樣,存的cookie也不一樣.
1.文件存儲.瀏覽器會針對不一樣的域,在磁盤的對應目錄建立一個單獨的文件,來存儲該域下面的cookie值.
2.內存存儲.當瀏覽器關閉時,該cookie隨之消失.根據下面的建立語法,當咱們未設置過時時間時則會出現這種狀況.
3.flash存儲.這種存儲方式是永久存儲在磁盤中,即便經過瀏覽器刪除一些數據都是沒法刪除該方式存儲的cookie,若是須要刪除,可能經過磁盤的方式.ajax
cookie的設置
Bool setcookie(string $name[, string $values, $expire=0[,string $path[,string $domain[, bool $secure = false[, bool $httpOnly = false]]]]] ); $name:cookie存儲的名稱,必填選項. $values:cookie存儲的值。這裏須要注意的是,當把該值設置爲false時,客戶端會嘗試刪除這個cookie值,所以在要將值這是爲true或者false的時候,咱們用另外的值來代替,例如true用1代替,false用0來代替. $expire:cookie的過時時間,秒爲單位,當該值被設置時,定時刪除;當該值沒有設置時,該值是永久有效的.該值設置爲小於當前時間時,會出發瀏覽器的刪除機制,會自動刪除cookie. $path:cookie有效的目錄,默認的目錄是"/",即表示當前的正個域名都生效. $domain:cookie的做用域名,默認的是當前域名有效,若是須要設置直接填寫生效的域名便可.須要注意的是IE瀏覽器有長度限制,當只有大於5的時候纔會生效. $secure:cookie的加密處理,當設置爲true的時候,須要使用HTTPS協議,纔會生效. $httpOnly:決定cookie是否只使用http協議,當設置爲1或者true,其餘非http協議是沒法操做cookie的。例如咱們未設置的時候,咱們JavaScript是能夠對cookie進行設置的.這樣必定程度上保證了安全性.這種狀況需考慮瀏覽器是否支持該配置項.
. 設置cookie的函數還有setrawcookie()函數,只不過該函數不會對值 進行urlencode序列號.
.<font color="red">有時候,咱們可能遇到這種狀況,咱們在這個頁面設置了cookie,可是去刷新頁面獲取cookie,按理說是會獲取到cookie的,但實際狀況是沒法獲取到,這是因爲cookie運行機制致使,PHP建立了cookie這個指令,告訴瀏覽器,你須要執行這個指令了,這時候瀏覽器纔會去執行這個指令,所以是沒法獲取到cookie的.</font>
. 在設置cookie以前,不能有任何輸出.算法
// 實現方式一 setcookie($cookie,"hello,world!", 3600); // 實現方式二 header("header("Set-Cookie: testcookie=中文; path=/; domain=.sunphp.org; expires=".gmstrftime("%A, %d-%b-%Y %H:%M:%S GMT",time()+9600));"); // 兩則的做用是同樣的,setcookie是PHP內置函數,是對http協議的操做封裝。
cookie的獲取
$_COOKIE['$cookeName'];
cookie的應用
. 用戶身份識別
. 數據傳輸
. 登陸控制(是否登陸、單點登陸)跨域
cookie跨域設置
咱們都知道,在前端開發中時常會遇到ajax跨域問題,咱們解決的方式有不少種,能夠參考這篇文章傳送門1,傳送門2,cookie跨域咱們能夠參考p3p傳輸協議傳送門瀏覽器
cookie使用的注意事項
.數量限制,客戶端對每個domian下的cookie是有數量限制的,不是建立任意數量就行.
.安全性,根據上面的建立語法,咱們能夠得知,當咱們未設置$httpOnly值得時候,非http協議是能夠操做cookie的值的,例如JavaScript經過cookie($cookieName).並且一些抓包工具也是能夠抓取到cookie的,還有就是cookie存儲在客戶端的文件中,若是獲取到這個cookie,也是能夠對cookie作一些操做的.爲了防止別人能夠拷貝cookie文件,進行惡意操做,能夠對cookie進行加密處理.
數據傳輸:當cookie數量不少,數據很大的時候,其實對於帶寬是有消耗的.比較http傳輸都須要帶寬,當http傳輸的數據量大了,帶了的帶寬消耗就大.安全
運行原理與存儲機制
. 運行原理
1.客戶端向服務端發起請求,創建通訊
2.服務端根據設置的session建立指令,在服務端建立一個編號爲sessionid的文件,裏面的值就是session具體的值(組成部分 變量名 | 類型 :長度:值).
3.服務端將建立好的sessionid編號響應給客戶端,客戶則將該編號存在cookie中(通常咱們在瀏覽器存儲的調試欄中會發現cookie中有一個PHPSESSID的鍵,這就是sessionid,固然這個名稱,我能夠經過設置服務端是能夠改變的).
.當下一次請求時,客戶端將這個sessionid攜帶在請求中,發送給服務端,服務端根據這個sessionid來作一些業務判斷.服務器
.存儲機制
1.存儲方式.session默認是文件存儲的.咱們能夠經過php.ini的配置來設置存儲驅動傳送門
2.生命週期.當咱們未設置session的生命週期時,當瀏覽器關閉以後存儲在客戶端的phpsessid自動消失,由於它是存在內存,下次創建鏈接的時候會從新建立一個phpsessid.以前的session,PHP會自動的根據垃圾回收機制自動刪除.這裏咱們能夠根據session_set_cookie_params($expire)函數來設置一個生命週期;
session的設置
session_start(); $_SESSION = $values;
. session_start()設置以前,不能有任何輸出
session的獲取
$_SESSION['values'];
session的使用場景
. 用戶身份識別
. 數據傳輸
. 登陸控制(是否登陸、單點登陸)
session的注意事項
.安全性,sessionid是按照必定的算法生成,要保證session的值惟一性和隨機性.
.客戶端禁用cookie,根據上面session的運行原理能夠得出,session的存儲於傳送仍是依賴於客戶端,所以當客戶端禁用cookie時,客戶端是沒法保存PHPSESSID的,這時候能夠經過url重寫或者表單來實現session的傳輸.
.存儲優化,按照上面的session建立,全部的session都會建立在一個目錄下面,同時有的無效session在垃圾回收機制時間內還不會刪除,當一臺服務器配置的站點較多時,這時候會生成不少的session文件,致使咱們讀取速度變慢,咱們能夠設置session的存儲目錄級別,save_path函數.通常大型的項目(如分佈式的項目),可使用其餘的存儲方式,如數據存儲,內存存儲.
session與cookie的區別
. session存儲在服務端,cookie存儲在客戶端.
.cookie的建立指令由服務端設置.
.session的sessionid須要客戶端存儲.
cookie與session的幾個誤區
.客戶端禁止cookie,session沒法使用?
使用url重寫或者表單提交能夠實現.
.session和cookie的安全性比較,session存在客戶端安全更高?
因爲cookie是存在客戶端的,相對來講安全性是要低一些,不過在建立的時候能夠設置$httpOnly值. 因爲cookie與session是相互關聯的,獲取到cookie必定程度上獲取到了session,一樣能夠操做session.
.cookie與session是否是在瀏覽器關閉的時候會消失?
這須要查看存儲機制了。cookie能夠存文件,內存,flash.存內存固然瀏覽器關閉則消失了;session因爲垃圾回收機制,當在垃圾回收機制內是不會刪除的,除非你代碼中顯示的作了刪除操做.
.cookie是存儲在客戶端中,如何增長其安全性?
咱們能夠在設置cookie的時候,增長一些特殊參數,如客戶端信息ip、瀏覽器信息等.
.當cookie存在客戶端的文件中,是否是每一個瀏覽器獲取到這個文件均可以進行操做?
要看瀏覽器之間對cookie的管理機制是否是同樣.