PHPCookie與Session的使用與區別
Cookie與Session
Cookie和session是目前使用的兩種儲存機制。cookie是從一個WEB頁到下一個WEB頁面的資料傳送方法,cookie儲存在客戶端;Session是讓資料在頁面中持續有效的一個傳遞方法,session儲存在伺服器端。
掌握了cookie與session這兩個技術,在WEB網站頁面間資訊傳遞的安全性是非常必要的,也是必不可少的。只要session存在,cookie就儲存這該sessionid,並在每次網頁請求時將該sessionid傳給伺服器。
要理解session和cookie的工作機制,需要理解http的B/S工作模式。瀏覽器每次請求(get或post),都可以通過表單將引數傳遞到指定的網頁。
一、Cookie管理
1、Cookie
Cookie 是一種在遠端瀏覽器端儲存資料並以此跟蹤和識別使用者的機制。簡單的說,cookie是WEB伺服器暫時儲存在使用者硬碟上的一個文字檔案,並隨後被WEB瀏 覽器讀取。當使用者在次訪問WEB網站時,網站通過讀取cookie檔案記錄這位訪客的特定資訊(如上次訪問的位置、花費的時間、使用者名稱和密碼等)從而迅速 做出響應,如在頁面中不需要輸入使用者名稱和密碼等,就可以直接登入網站等。文字檔案的命令格式如下:
使用者名稱@網站地址[數字].txt
開啟”我的電腦”—C盤(系統盤)—documentsand settings—administrator—cookie
這 個路徑就是cookie檔案儲存的路徑。Administrator是當前使用的使用者名稱,也就是登入本機的使用者 名,administrator@sogou[1].txt是指定格式自動生成的cookie檔案,index.dat是用來保儲所有開啟的WEB網站的 資訊,該檔案會隨著使用者開啟的網站隨時進行更新,在cookie資料夾下的每一個cookie檔案都是一個簡單而又普通的文字檔案,而不是程式。 Cookie中的內容大多是經過了加密處理的,因此表面看起來只是一些字母和數字的組合,這些內容只有伺服器才知道他們真正的含義。
Cookie常用於以下3個方面:
記錄訪客的某些資訊。如可以利用cookie記錄使用者訪問網頁的次數,或者記錄訪客曾經輸入過的資訊,另外,某些網站可以應用cookie自動記錄訪客上次登入的使用者名稱。
在頁面之間傳遞變數。瀏覽器並不會儲存當前頁面上任何變數資訊的,當頁面被關閉,頁面上的任何變數資訊將隨之消失。如果使用者宣告一個變數id=8,要把這 個變數傳遞到另一個頁面,可以把變數id以cookie形式儲存下來,然後在下一頁通過讀取該cookie來獲取變數的值。
將所檢視的internet頁礁在cookie臨時資料夾中,這樣可以提高以後瀏覽的速度。
2、建立Cookie
在 PHP中通過setcookie函式建立Cookie。在建立之前必須瞭解的是,cookie是HTTP頭標的組成部分,而頭標必須在頁面其他內容之前發 送,它必須最先輸出,即使在setcookie()函式前輸出一個HTML標記或echo語句,甚至一個空行都會導致程式出錯。語法如下:
Bool setcookie(string name[,string value[,int expire [,stringpath [,string domain [,int secure]]]]])
該函式的引數說明如表:
Name cookie的變數名 可以通過$_cookie[“cookiename”]呼叫變數名cookiename的cookie
Value cookie的變理名 該值儲存在客戶端不能用來儲存敏感資料。可以通過$_cookie[“value”]獲取名為values的值
Expire cookie的失效時間,expire是標準的UNIX時間標記,可以用time()函式或mktime()函式獲取,單位為秒。
Path cookie在伺服器端的有效路徑 如果該引數設定為“/”,則它就在整個domain下的/11目錄及子目錄內有效。預設是當前目錄。
Domain cookie有效的域名 如果要使cookie在mrbccd.com域名下的所有子域都有效,應該設定為mrbccd.com
Secure 指明cookie是否通過僅通過安全的https,值為0或1,如果值為1,則cookie只能在HTTPS連線上有效,如果值為預設值0,則cookie在HTTP和HTTPS連線上均有效。
例:
<?php
setcookie(“TMCcookie”,”www.baidu.com”);
setcookie(“TMCcookie”,”www.baidu.com”,time()+60); //設定cookie有效時間為60秒
setcookie(“TMCcookie”,$value,time()+3600,”/cs/”,”baidu.com”,1);
?>
3、讀取Cookie
在PHP中可以直接通過超級全域性資料$_cookie[]來讀取瀏覽器端的cookie值。
例:
<?php
if(!isset($_COOKIE[“visittime”])){ //檢測cookie檔案是否存在,如果不存在,往下執行
setcookie(“visittime”,date(“y-m-d H:i:s”)); //設定一個cookie變數
echo “歡迎第一次訪問網站。”;
}else{
setcookie(“visittime”,date(“y-m-dH:i:s”),time()+60); //如果存在,設定上帶cookie失效時間的變數。
echo “您上一次訪問的時間為:”.$_COOKIE[“visittime”];
echo “<br>”;
}
echo “您本次訪問網站的時間為:”.date(“y-m-dH:i:s”);
?>
過60秒後我們重新整理,則顯示的是第一次訪問的時間。
如果未設定cookie的到期時間,則在關閉瀏覽器時自動刪除cookie資料。如果為cookie設定了到期時間,瀏覽器將會記住cookie資料,即使使用者重新啟動計算機,只要沒有到期,再訪問網站時也會獲得資料資訊。
4、刪除Cookie
當cookie被建立後,如果沒有設定它的失效時間,其cookie檔案會在關閉瀏覽器時被自動刪除。如果想在關閉瀏覽器之前刪除cookie檔案,方法有兩種:一種是使用setcookie()函式刪除,另一種是使用瀏覽器手動刪除cookie。
(1)、使用setcookie()函式刪除cookie
刪除cookie和建立cookie的方式基本類似,刪除cookie也使用setcookie()函式。刪除cookie只需要將setcookie()函式中第二個引數設定為空值,將第三個引數cookie的過期時間設定為小於系統的當前時間即可。
例如:將cookie的過期時間設定為當前時間減1秒,程式碼如下:
setcookie(“name”,””,time()-1);
time()函式返回以秒錶示的當前時間戳,把過期時間減1秒就會得到過去的時間,從而刪除cookie. 注意:把過期時間設定為0,可以直接刪除cookie.
(2)、使用瀏覽器手動刪除cookie
在使用cookie時,cookie自動生成一個文字檔案儲存在IE瀏覽器的cookies臨時資料夾中。使用瀏覽器刪除cookie檔案是非常便捷的方法。
開啟一個頁面—–工具—–internet選項,在“常規”選項卡——刪除cookie按鈕,彈出“刪除temporaryinternet files資料夾中的所有cookies嗎?”—–單擊“確定”,即可成功刪除全部cookie檔案。
5、Cookie的生命週期
如果cookie不設定時間,就表示它的生命週期為瀏覽器會話的期間,只要關閉IE瀏覽器,cookie就會自動消失。這種cookie被稱為會話cookie,一般不儲存在硬碟上,而是儲存在記憶體中。
如果設定了過期時間,那麼瀏覽器會把cookie儲存到硬碟中,再次開啟IE瀏覽器時會被依然有效,直到它的有效期超時。
雖然cookie可以長期儲存在客戶端瀏覽器中,但也不是一成不變的。因為瀏覽器允許最多儲存300個cookie檔案,而且每個cookie檔案支援最大容量為4KB,每個域名最多支援20個cookie,如果達到限制,瀏覽器會自動地隨機刪除cookies.
6、 Cookie的綜合應用
在進行網站開發時,都需要製作一個計數器來記錄網站的訪問量,以此來吸引更多的訪客關注網站。
例:
<?php
if(!empty($_COOKIE[“counter”])){
$counter=$_COOKIE[“counter”]+1;
}
else{
$counter=1;
}
setcookie(“counter”,$counter,time()+2678400);
echo “您是第”.$counter.”位訪客。”;
?>
關閉瀏覽器時也不會停止記數,除非C:Documents and SettingsAdministratorLocalSettingsTemporary Internet Files將檔案進行刪除才可以。
計數器的實現方法有多種。
二、Session管理
對比cookie,會話檔案中儲存的資料是在PHP指令碼中以變數的形式建立的,建立的會話變數在生命週期(20分鐘)中可以被跨頁的請求所引用。另外,session是儲存在伺服器端的會話,相對安全,並且不像cookie那樣有儲存長度的限制。
1、瞭解session
Session被譯成中文為“會話”,其本義是指有始有終的一系列動作/訊息,如打電話。
在計算機專業術語中,session是指一個終端使用者與互動系統進行通訊的時間間隔,通常指從註冊進入系統到登出退出系統之間所經過的時間。因此,session實現上是一個特定的時間概念。
2、Session的功能
Session 在WEB技術中佔有非常重要的份量。由於網頁是一種無狀態的連線程式。因此無法得知使用者的瀏覽狀態。因此必須通過session記錄使用者的有關資訊,以供 使用者再次以此身份對WEB伺服器提供要求時作確認。例,在電子商務網站中,通過session記錄使用者登入的資訊,以及使用者所購買的商品,如果沒有 session,那麼使用者就會每進入一個頁面都登入一遍使用者名稱和密碼。
另外,session會話適用於儲存使用者的資訊量比較小的情況。如果使用者需要儲存的資訊量相對較少,並用對儲存內容不需要長期儲存,那麼使用session把資訊儲存到伺服器端比較適合。
3、建立會話
建立一個會話需要通過以下幾個步驟實現:
啟動會話——–註冊會話——-使用會話——-刪除會話
1)啟動會話
啟動會話的方式有兩種:一種是使用session_start()函式,另一種使用session_register()函式為會話登入一個變數來隱含地啟動會話。
通常,session_start()函式在頁面開始位置呼叫,然後會話變數被登入到資料$_session。
其語法格式為:
Bool session_start(void);
使用session_start()函式之前瀏覽器不能有任何輸出,否則會產生類似以下的錯誤提示。
如果想使用session_satrt()這個全域性變數來儲存你的資料的話得在php.ini檔案中配置你的資訊:
session.save_path = “D:/program files/php/temp”
例:
<?php
echo “呵呵……”;
session_start();
?>
執行結果如下:
呵呵……
Warning: session_start()[function.session-start]:Cannot send session cache limiter – headers already sent (output started atC:webserverwwwroot11.php:1) in C:webserverwwwroot11.php on line 3
<?php
session_start();
?>
注意:該程式碼前不要有任何的程式碼,如果新建的檔案預設有的內容,要刪除。
Session_register()函式用來為會話登入一個變數來隱含地啟動會話,但要求設定php.ini檔案的選項,將register_globals指令設定為ON,然後重新啟動apache伺服器。
使用session_register()函式時,不需要呼叫session_start()函式,PHP會在註冊變數之後隱含地呼叫session_start()函式。
2)註冊會話
會話變數被啟動後,全部儲存在陣列$_session中。通過陣列$_session建立一個會話變數很容易,只要直接給該陣列新增一個元素即可。
例:
<?php
session_start();
$_SESSION[“admin”]=null;
?>
3)使用會話
首先需要判斷會話變數是否有一個會話ID存在,如果不存在,就建立一個,並且使用其能夠通過全域性陣列$_SESSION進行訪問。如果已經存在,則將這個已註冊的會話變數載入以供使用者使用。
例:
<?php
session_start();
$_SESSION[“admin”]=id;
if(!empty($_SESSION[“admin”])){
$myvalue=$_SESSION[“admin”];
echo $myvalue;
}else{
echo “該會話不存在。”;
}
?>
4)刪除會話
刪除會話的方法主要有刪除單個會話、刪除多個會話和結束當前會話的3種。
a) 刪除單個會話
刪除會話變數,同陣列的操作一樣,直接登出$_SESSION陣列的某個元素即可。
例如:登出$_SESSION[“admin”]變數,可以使用unset()函式,程式碼如下:
unset($_SESSION[“admin”]);
b) 刪除多個會話
如果想要一次登出所有的會話變數,可以將一個空的陣列賦值給$_SESSION,程式碼如下:
$_SESSION=array();
c)結束當前的會話
如果整個會話已經結束,首先應該登出所有的會話變數,然後使用session_destroy()函式清除結束當前的會話,並清空會話中的所有資源,徹底銷燬session,程式碼如下:
session_destroy();
4、Session的綜合應用—-通過session判斷使用者的操作許可權
大多數網站的開發過程中,需要對管理員和普通使用者對操作網站的許可權進行劃分。
例:13.php
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN””http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html;charset=gb2312″ />
<title>用session判斷使用者操作許可權</title>
<script type=”text/javascript”language=”javascript”>
function check(){
if(form1.user.value==””){
alert(“請輸入使用者名稱,謝謝!”);
form1.user.focus();
return false;
}
if(form1.pwd.value==””){
alert(“請輸入密碼,謝謝!”);
form1.pwd.focus();
return false;
}
form1.submit();
}
</script>
</head>
<body>
<form name=”form1″ method=”post”action=”check_13.php”>
使用者名稱:<input type=”text”name=”user” size=”20″ /><br /><br />
密 碼:<inputtype=”password” name=”pwd” size=”21″ /><br/><br />
<input type=”submit” name=”submit”value=”提交” onclick=”check()”/>
<input type=”reset” name=”reset”value=”重置” />
</form>
</body>
</html>
check_13.php
<?php
session_start();
$_SESSION[user]=$_POST[user];
$_SESSION[pwd]=$_POST[pwd];
?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN””http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type”content=”text/html; charset=gb2312″ />
<title>check_13.php</title>
</head>
<body>
<?php
if($_SESSION[user]==””){
echo”<script> alert(`請選擇正確的登入途徑!`);history.back();</script>”;
}
if($_SESSION[user]==”123″ &&$_SESSION[pwd]==”123″){
echo “您是管理員使用者<br>”;
echo “<ahref=`admin.php`>請進入管理員使用者管理頁面。</a>”;
}else{
echo “您是普通使用者”;
echo “<ahref=`user.php`>請進入普通使用者管理頁面。</a>”;
}
?>
<?php
session_start();
unset($_SESSION[user]);
unset($_SESSION[pwd]);
session_destroy();
?>
</body>
</html>
三、Cookie與Session的比較
它 們最大的區別是Session是將Session的資訊儲存在伺服器上,並通過一個Sessionid來傳遞客戶的資訊,同時伺服器接收到 Sessionid後,根據這個ID來提供相關的Session資源;cookie是將所有的資訊以文字檔案的形式儲存在客戶端,並由瀏覽器進行管理和維 護。
由於session為伺服器儲存,所以遠端使用者無法修改session檔案的內容。而cookie為客戶端儲存,所以session要比cookie安全得多。當然使用session還有很多優點,如控制容易,可以按照使用者自定義儲存(儲存於資料庫)。
更多PHP 學習資料
盡在 愛思社群(http://bbs.aseoe.com/forum.phpmod=forumdisplay&fid=41&filter=typeid&typeid=17 )
cookie工作機理:
a) 伺服器通過隨著響應傳送一個http的Set-Cookie頭,在客戶機中設定一個cookie(多個cookie要多個頭).
b) 客戶端自動向伺服器端傳送一個http的cookie頭,伺服器接收讀取.
HTTP/1.x 200 OK
X-Powered-By: PHP/5.2.1
Set-Cookie: TestCookie=something from somewhere; path=/
Expires: Thu, 19 Nov 2007 18:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-type: text/html
這一行實現了cookie功能,收到這行後
Set-Cookie: TestCookie=something from somewhere; path=/
瀏覽器將在客戶端的磁碟上建立一個cookie檔案,並在裡面寫入:
TestCookie=something from somewhere;
/
這一行就是我們用setcookie(`TestCookie`,`something from somewhere`,`/`);的結果.也就是用header(`Set-Cookie: TestCookie=something from somewhere; path=/`);的結果.
會話
訪問網站的來客會被分配一個唯一的識別符號,即所謂的會話 ID。它要麼存放在客戶端的 cookie,要麼經由 URL 傳遞。
會 話支援允許使用者註冊任意數目的變數並保留給各個請求使用。當來客訪問網站時,PHP 會自動(如果 session.auto_start 被設為 1)或在使用者請求時(由 session_start() 明確呼叫或 session_register() 暗中呼叫)檢查請求中是否傳送了特定的會話ID。如果是,則之前儲存的環境就被重建。
sessionID的傳送
1 通過cookie傳送sessin ID
使用session_start()呼叫session,伺服器端在生成session檔案的同時,生成session ID雜湊值和預設值為PHPSESSID的session name,並向客戶端傳送變數為(預設的是)PHPSESSID(session name),值為一個128位的雜湊值.伺服器端將通過該cookie與客戶端進行互動.
session變數的值經php內部系列化後儲存在伺服器機器上的文字檔案中,和客戶端的變數名預設情況下為PHPSESSID的coolie進行對應互動.
即伺服器自動傳送了http頭:header(`Set-Cookie: session_name()=session_id(); path=/`);
即setcookie(session_name(),session_id());
當從該頁跳轉到的新頁面並呼叫session_start()後,PHP將檢查與給定ID相關聯的伺服器端存貯的session資料,如果沒找到,則新建一個資料集.
2 通過URL傳送session ID
只有在使用者禁止使用cookie的時候才用這種方法,因為瀏覽器cookie已經通用,為安全起見,可不用該方法.
<a href=”http://blog.163.com/wz_pk007/blog/p.php?<?php print session_name() ?>=<?php print session_id() ?>”>xxx</a>,也可以通過POST來傳遞session值.inttest
對於訪問量大的站點,用預設的session存貯方式並不適合,目前最優的方法是用資料庫存取session.
本文轉自 a_liujin 51CTO部落格,原文連結:http://blog.51cto.com/a1liujin/1737105,如需轉載請自行聯絡原作者
相關文章
- cookie與session的區別CookieSession
- session與transaction的區別Session
- session與cookie的區別SessionCookie
- cookie與session的區別與聯絡CookieSession
- Session與Cookie的區別與聯絡SessionCookie
- cookie和session的詳解與區別CookieSession
- Session和Cookie的聯絡與區別SessionCookie
- Session和Cookie的區別與聯絡SessionCookie
- cookie與session的區別(圖文詳解)CookieSession
- connection session process的聯絡與區別Session
- 理解cookie、session、localStorage、sessionStorage的關係與區別CookieSession
- synchronized與Lock的區別與使用詳解synchronized
- mysql與redis的區別與使用場景MySqlRedis
- 【oracle rowid與rownum的使用與區別 】Oracle
- cookie與session的使用CookieSession
- cookie與session的區別以及在Django中的實現CookieSessionDjango
- 「Vue」與「React」--使用上的區別VueReact
- 集合使用copy與mutableCopy的區別
- &與&&, |與||區別
- ??與?:的區別
- YII 的 with 與 joinwith 的區別和使用
- Session是什麼?它與Cookie有什麼區別?SessionCookie
- Node中Exports與module.export的使用與區別Export
- rem與em的區別||結合使用rem與emREM
- 由JSESSIONID談cookie與SESSION的區別和聯絡JSSessionCookie
- in與exist , not in與not exist 的區別
- su和sudo的區別與使用(轉)
- MySQL的@與@@區別MySql
- mybatis #與$的區別MyBatis
- Null 與 “” 的區別Null
- Gradle 使用技巧(三) - dependencies 的型別與區別Gradle型別
- rem與em的使用和區別詳解REM
- Go 語言 := 的具體使用與區別Go
- PHP isset()與empty()的使用區別詳解PHP
- Lua中ipairs()和pairs()的區別與使用AI
- C與C++中struct使用的區別C++Struct
- disconnect session和kill session的區別Session
- sys使用者與system使用者的區別