對Cookie和Session的理解

2021-08-14 04:23:01 字數 4245 閱讀 9253

cookie和session的產生背景:

在動態頁面裡面,每個變數都是有有效期的,所有的變數的最大生命週期就是乙個指令碼的週期(拿php來說,瀏覽器向伺服器發出一次請求,請求到達伺服器後,伺服器將該請求交由php處理,php處理完了以後交給伺服器,最後伺服器響應給瀏覽器,這就是乙個指令碼週期,也就是乙個變數的最大有效期)。

這時候問題出來了,如果我登入了乙個**,這個**需要確定我是不是它的使用者,第一次請求我成功登入了該**的首頁,然後我開始瀏覽這個**上的其他網頁,瀏覽其他網頁的時候,這個**的伺服器該怎麼確定我是不是已經登入上了該**呢?

這時候就需要使用乙個變數來儲存這個標誌,而這個標誌可以代表我是已經合法登入上來了,所以這個變數的有效週期就需要被延長,那麼怎麼延長呢?

答案是1.cookie 2.session

下面是對cookie的介紹:

cookie是由伺服器端生成,傳送給user-agent(一般是瀏覽器),瀏覽器會將cookie的key/value儲存到某個目錄下的文字檔案內,下次請求同一**時就傳送該cookie給伺服器(前提是瀏覽器設定為啟用cookie)。cookie名稱和值可以由伺服器端開發自己定義,對於jsp而言也可以直接寫入jsessionid,這樣伺服器可以知道該使用者是否是合法使用者以及是否需要重新登入等,伺服器可以設定或讀取cookies中包含資訊,藉此維護使用者跟伺服器會話中的狀態。

從上面我們可以知道,cookie是瀏覽器端的一種技術。那麼我們寫程式的時候應該怎麼使用cookie呢?下面是使用cookie的基本操作(php):

設定(增刪改):

setcookie(key, value) :完成cookie資料的設定(增),key存在則更新(改),不存在則新增。如果值為空字串,表示刪除該key(刪)

獲取(查):

$_cookie['key']:php在初始化階段,會將所有的cookie資料整理到此變數中,供php指令碼使用。

設定cookie的有效期(第三個引數):

setcookie("key","value",timestamp):第三個引數採用時間戳表示。

特殊的有效期值:0:表示預設的,也就是乙個會話週期;

time()-1 :刪除cookie的標準做法,比如:setcookie('key','',time()-1)

php_int_max:邏輯上表示永久有效的cookie,實際上是到了2023年。。。

cookie的有效期

判定cookie的有效期的是瀏覽器,伺服器在設定cookie時,會告訴瀏覽器該cookie的有效期。瀏覽器在傳送請求的時候會判斷cookie是否有效,只有沒有過有效期的cookie資料才會被攜帶。

設定cookie的有效路徑(第4個引數):

setcookie("key", "value", "timestamp", /): 『/』:表示整站有效。也就是同一網域名稱下都有效。

cookie的有效路徑

cookie在當前路徑以及後代路徑有效。這裡的路徑,不是**檔案所在的本地磁碟路徑,而是瀏覽器訪問的url路徑關係。不同路徑下面,同名的cookie可以同時存在於瀏覽器中。也就是cookie中可能會出現兩個key一樣的。

設定cookie的有效域(第5個引數):

setcookie("key", "value", timestamp, /, "blog.hengshare.top"):表示在blog.hengshare.top這個二級網域名稱下面都有效。為空表示在當前請求url的網域名稱下面有效。

設定是否僅安全傳輸(第6個引數):

setcookie("key", "value", timestamp, /, domain, true|false):為true表示僅支援安全傳輸,false為預設值,表示不管是http還是https,都可以將有效的cookie攜帶至伺服器端

設定httponly(第7個引數):

setcookie("key", "value", timestamp, /, domain, true|false, true|false):預設為false,表示瀏覽器儲存的cookie是可以被其他指令碼所處理的。為true時,表示cookie僅可以在http請求中使用,建議:true

下面是對session的解釋:

根據以上解釋,我們知道session是一種基於cookie的一種機制。而與cookie不同的是,session的會話資料是存放在伺服器端的,僅在瀏覽器端維持乙個sessionid,用來標識某個會話對應的伺服器端的session資料區,用來配對使用。下面是對session的詳細使用(php):

開啟session:

session_start(); :也可以通過php的配置檔案設定為自動開啟。(php.ini中對應的選項為:session.auto_start)

利用$_session操作session資料:

$_session['key'];  :(session可以存放任意型別的資料,cookie只能存放字串資料)

session的會話資料預設存放在伺服器端作業系統的臨時目錄/tmp中。

銷毀session:

session_destory();    :刪除當前的session對應的資料區,關閉session機制。並不完成session的寫操作。

session_destory();  //刪除資料區

unset($_session); //銷毀變數

setcookie(session_name(), '', time()-1); //銷毀cookie中的sessionid

清空session資料:

$_session=array();   //不要使用unset($_session)

session 的資料屬性:

1.有效期:session.cookie_lifetime

2.有效路徑:session.cookie_path

3.有效域:session.cookie_domain

4.是否僅安全傳輸:session.cookie_secure

5.是否僅http使用:session.cookie_httponly

修改以上的屬性有以下幾種辦法:

1.更改php.ini配置檔案(不建議)

2.通過在指令碼中使用ini_set()來進行配置修改,僅在設定後的指令碼週期內有效,要保證在開啟session前設定完畢。

3.使用特定功能函式:session_set_cookie_params(有效期,有效路徑,有效域,是否僅安全傳輸,是否httponly);  注意:也是要在開啟session之前設定完畢。

session的一些注意事項:

session可以存放任意型別的資料,因為session資料區裡面的資料是經過序列化以後才儲存的。

$_session陣列的下標,僅僅可以是字串型別。

session_start()函式類似於header()函式,前面不應該有輸出。

在同一指令碼內使用session_destory()函式,之後如果對session進行了操作,並不會將修改儲存到session資料區,所以在下次指令碼週期就不能獲取到儲存的session資料了。

session和cookie比較

cookie

session

會話資料儲存位置

瀏覽器端

伺服器端

安全性低

高資料傳輸量大小

支援會話數量

有限制,單個最大4k

無限制支援資料型別

字串all

談談你對Session和Cookie的區別理解

session 伺服器 cookie 客戶端 session value為物件,object型別 cookie value為字串,如果我們儲存乙個物件,這個時候,就需要將物件轉換為json session 受伺服器記憶體控制 cookie 一般來說,最大為4k session 伺服器端控制,預設是3...

php關於對cookie與session的理解

對於cookie的理解 cookie是伺服器留給客戶端的禮物 小甜點 來完成伺服器對使用者的身份驗證的一種方式 具體的來講就是,當使用者登入伺服器的時候有伺服器通過setcookie函式在客戶端的瀏覽器 裡面存上一些能標明身份的資料 使用者名稱,密碼,登入與否 等到同乙個使用者訪問該站點 的其他的網...

cookie和session和token是什麼?

什麼是session?什麼是cookie?什麼是token?1 cookie?由於http是一種無狀態協議,伺服器沒有辦法單單從網路連線上面知道訪問者的身份,為了解決這個問題,就誕生了cookie cookie實際上是一小段的4k文字資訊。客戶端請求伺服器,如果伺服器需要記錄該使用者狀態,就使用re...