會話控制:就是為了我們在訪問頁面和頁面之間的跳轉是,能夠識別到你的登錄狀態,已經你的登錄時長等
在php的會話控制當中,涉及到兩個概念Cookie和Session
Cookie 會話控制
原理:在登錄時候,會將你的用戶名密碼等信息保存在cookie中(cookie在客戶端[瀏覽器]中存在,不安全),當每次登錄首頁時,都會先判斷cookie中是否有對應的cookie信息保存,如果有,則直接判斷登錄,不需要重新輸入用戶名和密碼,同樣的,在頁面跳轉是,也通過cookie判斷,訪問頁面的是否是同一個用戶
setcookie()
setrawcookie()
參數一:$name cookie 的名字
參數二:$value cookie的值
參數三:$expire 設置cookie的過期時間,默認為0 單位是秒
參數四:$path 設置cookie的有效路徑,默認是當前目錄下有效,也可以指定目錄
參數五:$domain 設置的cookie的作用域 默認在本地作用域localhost下
參數六:$secure 設置是否cookie只能通過https傳輸,默認值為false
參數七:$httponly 是否只能使用http訪問cooki,默認為false,如果開啟,可以減少xss攻擊
在php文件中輸入 setcookie('nv','jx',time()+3600,'/');即可插入一條cookie數據,並且在瀏覽器F12打開控制台后查看得到
那么,每個頁面都會在我們的瀏覽器當中留下cookie信息,網頁當中如何去識別這些cookie信息,並精准定位呢
就是在第五個參數 Domain中,設定cookie的作用域,只有在對應作用域下訪問,才能顯示該作用域網頁所留下的所有cookie信息,如果將$path定位到對應的某個文件里面,那么久更加的精准了
那么對於cookie的更新,刪除就更簡單了,
共同點:必須保持 保持$name $path 和$domain 一致
不同點:
更新,更改值 $value
刪除:修改過期時間
同時:我們也可以通過header頭信息來傳輸cookie信息
格式:heaedr("Set-Cookie:name=value[;expires=date][;path=path][;domain=domain][;secure=secure][;httponly=httponly]")
header('Set-Cookie:obj=hahah;expire='.gmdate('Y M D H:i:s',time()).';path=/;httponly=true');
Session的會話控制
原理:當客戶端訪問服務器時,服務器根據需求設置session,將會話信息保存在服務器上,同時將標示session的session_id傳遞給客戶端瀏覽器,
瀏覽器將這個session_id保存在內存中(cookie,url地址傳遞等),瀏覽器每次請求都會拿着存儲在cookie或通過url地址將本地的session的id去匹配服務器上面的那個session_id,就能取得客戶端的數據狀態。
如果客戶端瀏覽器意外關閉,服務器保存的session數據不是立即釋放,此時數據還會存在,但是我們設置在瀏覽器的的session_id的時間都是會話時間,當瀏覽器已關閉,就會消失,所以,我們需要通過cookie來講session設置的session_id保存更久的時間
session所涉及的函數
session_start();//每個頁面使用session時都必須打開,不推薦在配置文件中一直打開,浪費資源
$_SESSION['鍵'] = ‘值’;//設置session的內容,可以為用戶名,密碼,或其他基本信息等
session_id() //獲取我們的設置session是所隨機配置給你的id值
session_name() //獲取我們存儲是的名字,配置中默認為PHPSESSID,可以到配置文件中修改
SESSION_destroy()//進行對session的銷毀
.......(還有很多api,請查詢php.net(▰˘◡˘▰))
在上圖中,我們發現,我們通過session來存儲信息時,是會話時間,我們可以通過cookie來再保存一次,並設置時間的長度
setcookie(session_name(),session_id(),time()+3600,'/');//將獲取的session_name()的值,和session_id()的值作為cookie的名稱和值,重新插入cookie中即可
當然,以上的session會話控制,也是要依賴於cookie來保存
禁用Cookie時
但如果當我們的客戶端禁用掉cookie之后,如何處理呢?
既然問出來,當然是可以的
就是通過我們的地址欄url來傳輸我們的內容
我們知道,我們將信息保存到客戶端之后,我們在后台只需要去控制兩個值
1.session_name(); 2.session_id();
只要控制着兩個值,就能隨時獲取到我session中設置的值
首先:通過地址欄寫入我們的session_name(); 和session_id();
echo "<a href='1.php?'".session_name().'='.session_id()."‘>查看信息</a>";
第二步:當1.php獲取到我的session_name()和session_id()時,我們就進行賦值和
session_id($_GET[session_name()]);
session_start();
獲取$_SESSION
最后一步:銷毀我們的session
主要步驟是:1.清空$_SESSION //$_SESSION = [] 等於一個空數組
2.清空cookie的數據 //同樣的將cookie的過期時間調到當前時間的前面
3.session_destroy()//銷毀session會話
總結:
無論是cookie還是session都能進行會話控制
cookie保存在客戶端中,安全性不高,當然我們可以通過加密和字符串連接等方式進行加強安全性,
session 保存在服務器中,但同時也依賴於cookie,雖然可以通過其他方式訪問,但推薦使用cookie方式,安全性比較強