session 與 cookie 是什麼?
session 與 cookie 屬於一種對談控制技術。常用在身份識別,登入驗證,資料傳輸等。舉個例子,就像我們去超市買東西結賬的時候,我們要拿出我們的會員卡才會獲取優惠。這時候,我們怎麼識別這個會員卡真實有效的呢?當我們將會員號給到收銀員,收銀員根據我們提供的會員號,輸入到系統中,系統根據這個會員號去查詢,如果查詢到了就證明這個會員號是真實存在的。這裡的會員號就好比 cookie 與 session. 會員系統就好比伺服器端,收銀員就好比用戶端.
為什麼會用到 session 與 cookie 呢?
根據上述的例子,我們知道 session 與 cookie 是可以幹什麼的了,那為什麼必須用這個來實現呢?這裡就有必要了解一下 http 應用傳輸協定的特點了。由於 http 協定是無狀態的,即瀏覽器去請求了一個網頁,這時候就是一個 http 請求,當伺服器端接收到請求之後,返回用戶端需要的資料,在這過程中瀏覽器與伺服器是建立了一個連線的。但是當伺服器端返回資料,用戶端收到資料之後,他們的這種連線關係就斷開了。下次瀏覽器再去傳送請求的時候,又是重新建立一個連線,這兩個連結沒有任何關係。試想一下,當我們登入一個商場系統的時候,進入首頁做了登入操作,但是我們下單或者加入購物車的時候,還需要登入,每存取一個頁面就要登入,是不是很繁瑣同時也是很不科學的,萬一我們加入購物車的商品,我們點選下單了,下單頁面要登入而且還無法正確的反饋出你下單時的那些商品.
Http 特點
1.http 協定支援用戶端 / 伺服器端模式,也是一種請求 / 響應模式的協定。
2. 無連線。所謂的無連線就是伺服器收到了用戶端的請求之後,響應完成並收到用戶端的應答之後,即斷開連線。限制每次的連線只處理一次請求。從而節省傳輸時間。
3. 無狀態。http 協定對事務的處理沒有記憶能力。也就意味著如果需要前面的資訊,只能重傳,這無形之中增加資料的傳輸量。這種方式某種方面上講解放了伺服器,但是卻不利於用戶端與伺服器的連線。為了彌補這種不足,產生了兩項記錄 http 狀態的技術,一個叫做 Cookie, 一個叫做 Session,後面我們再細講它們。
4. 簡單快捷:所謂的簡單快捷是指用戶端向伺服器請求服務時,一般來說只需要傳輸請求方法和路徑,就能進行存取
5. 靈活:這裡主要指的是用戶端可以通過 http 協定傳輸任意型別的資料。比如傳輸.jpg 檔案、.ppt 檔案等等,只需要設定 content-type 就可以進行傳輸。
Cookie
cookie 的基本概念
cookie 是遠端瀏覽器儲存資料以此追蹤使用者和識別使用者的的機制,從實現來說,cookie 是儲存在用戶端上的一個資料片段。
cookie 的執行原理與儲存機制
. 執行原理
1. 用戶端向伺服器端發起一個 http 請求.
2. 伺服器端設定一個建立 cookie 的指令,響應給用戶端.
3. 用戶端收到伺服器端響應的指令,根據指令在用戶端建立一個 cookie.
4. 擋下一次請求時,用戶端攜帶這個 cookie 向伺服器端傳送請求.
. 儲存機制
總的來說,cookie 在用戶端儲存的形式有三種,不同的瀏覽器的儲存機制不同,存的 cookie 也不同.
1. 檔案儲存。瀏覽器會針對不同的域,在磁碟的對應目錄建立一個單獨的檔案,來儲存該域下面的 cookie 值.
2. 記憶體儲存。當瀏覽器關閉時,該 cookie 隨之消失。根據下面的建立語法,當我們未設定過期時間時則會出現這種情況.
3.flash 儲存。這種儲存方式是永久儲存在磁碟中,即使通過瀏覽器刪除一些資料都是無法刪除該方式儲存的 cookie,如果需要刪除,可能通過磁碟的方式.
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 的.
. 在設定 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 傳輸的資料量大了,帶了的頻寬消耗就大.
Session
執行原理與儲存機制
. 執行原理
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['values'] = ''; // 該函數是清空所有的session,慎用! session_destroy(); // 連values這個session鍵都會刪除 unset($_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的管理機制是不是一樣.
相關推薦:《PHP教學》
以上就是PHP 不得不提的 session 與 cookie的詳細內容,更多請關注TW511.COM其它相關文章!