cookie和session原理
? session
? session_start() 開(kāi)啟session機(jī)制,告訴php我想使用session了
?? ?列:
?? ?$_SESSION['age']='18';
?? ?$_SESSION['name']='zhengsan';
?? ?刪除一個(gè)session值
?? ?unset($_SESSION['name'])
?? ?清空session
?? ?session_destroy()
?? ?修改session
?? ?$_SESSION['name']="lisi";
因?yàn)閟ession比cookie安全,所以登錄和注冊(cè)用session而不用cookie
session是基于cookie的
設(shè)置session后再本次會(huì)話中session將會(huì)共享
本次會(huì)話中瀏覽器第一次往服務(wù)器上發(fā)送http請(qǐng)求
服務(wù)器解析請(qǐng)求地址,等解析到session_start()時(shí)
會(huì)在服務(wù)器的//目錄下簡(jiǎn)歷一個(gè)sess_adcdefg的一個(gè)文件,
繼續(xù)解析,可以將session值存儲(chǔ)到該文件里,
等該文件解析完畢后回復(fù)給瀏覽器,
告訴瀏覽器將sessionID=abcdefg(session文件名稱,以cookie的方式存儲(chǔ)在瀏覽器內(nèi)存里,
下次再請(qǐng)求改服務(wù)器時(shí),
會(huì)將sessionID=abcdefg帶到服務(wù)器上碰到session_start(),
首先會(huì)往/tmp目錄下尋找與sessionID同名的文件,
如果找到就直接用該文件里的數(shù)據(jù),如果沒(méi)有找到則新建一個(gè)文件.
經(jīng)驗(yàn)所得:
一般存session時(shí)存儲(chǔ)的是登錄用戶基本信息,
一般是個(gè)數(shù)組,最起碼得有用戶的ID;
注冊(cè)時(shí)只設(shè)置session;
登錄時(shí)不管有沒(méi)有設(shè)置7天免登錄都要設(shè)置session,設(shè)置7天免登錄就將用戶信息存儲(chǔ)7天;
檢測(cè)是否分發(fā)登錄時(shí)我們只需要檢測(cè)session就行,因?yàn)閟ession安全;
檢測(cè)session之前我們需要檢測(cè)上次是否設(shè)置了7天免登錄,
(當(dāng)cookie存在且session不存在時(shí),將cookie里的值賦給session)
cookie
cookie里面只能存基本類型(整型,布爾型,字符串,浮點(diǎn)型....),不能存數(shù)組;
會(huì)話cookie:cookie值在關(guān)閉瀏覽后會(huì)消失;
cookie 可以偽造,不安全
?? ?設(shè)置cookie
?? ?setcookie( "cookie的名稱","cookie的值")
?? ?取cookie的值
?? ?$_COOKIE["coolie的名稱"]
?? ?持久cookie
?? ?cookie值在關(guān)閉瀏覽后不會(huì)消失;等時(shí)間超過(guò)我們?cè)O(shè)置cookie的時(shí)間時(shí)才會(huì)消失
?? ?setcookie("cookie的名稱","cookie的值",time()+過(guò)期時(shí)間)
?? ?刪除cookie的值
?? ?setcookie("cookie的名稱","cookie的值",time()-1)
?? ?會(huì)話cookie原理
?? ?瀏覽器往服務(wù)器發(fā)起http請(qǐng)求;服務(wù)器會(huì)處理http請(qǐng)求,調(diào)用php模塊,
?? ?解析請(qǐng)求的頁(yè)面,當(dāng)解析到setcookie("name","zhengsan")這行代碼后,
2等到該頁(yè)面完全解析完畢,服務(wù)器會(huì)回復(fù)給瀏覽器,同事告訴瀏覽器讓瀏覽器存儲(chǔ)一下(name=zhengsan)這條數(shù)據(jù),存儲(chǔ)到瀏覽器所占用的內(nèi)存里;
3下一次再次發(fā)送http請(qǐng)求時(shí),就會(huì)內(nèi)存里的(name=zhengsan)帶給服務(wù)器,服務(wù)器就能獲取cookie;
4如果關(guān)閉瀏覽器,內(nèi)存里的數(shù)據(jù)就會(huì)消失,就不會(huì)帶數(shù)據(jù)給服務(wù)器了;
</dl>
七天免登陸:
<h4>|:cookie的七天免登陸原理:</h4>
?? cookie的七天免登陸就是將cookie的值存在了客戶端硬盤(pán)的文件里了,當(dāng)關(guān)閉瀏覽器后內(nèi)存中的 cookie值消失了
?? 當(dāng)再次開(kāi)啟瀏覽器后如果訪問(wèn)這個(gè)網(wǎng)站的話,瀏覽器會(huì)自動(dòng)將客戶端硬盤(pán)的cookie值讀取到內(nèi)存中通過(guò)瀏覽器發(fā)送http協(xié)議
?? 發(fā)送到服務(wù)器里,這時(shí)候就可以直接訪問(wèn)了.
?<h4> ||:session的七天免登陸原理:</h4>
?? 其實(shí)就是重新走了一次登錄處理頁(yè)面,只不過(guò)不用再進(jìn)行數(shù)據(jù)庫(kù)驗(yàn)證了,
?? 直接從cookie文件中取出來(lái)了數(shù)據(jù)庫(kù)里的用戶名和用戶ID
?? 而防非法登錄檢測(cè)的就是session里面的數(shù)值用戶名和用戶ID
? ?
?? 其實(shí)session和cookie的七天免登陸都是省去了登錄處理頁(yè)面,直接到了登錄后的首頁(yè)
?? 只不過(guò)是cookie直接獲取了,而session則是又重新設(shè)置了一次將存儲(chǔ)在cookie里的用戶信息
?? 重新設(shè)置在了session文件里,從而就實(shí)現(xiàn)了免登陸,他們都是免去了數(shù)據(jù)庫(kù)查詢驗(yàn)證這一步
? session和cookie對(duì)比:
?session和cookie都是通過(guò)服務(wù)器存儲(chǔ)在瀏覽器的,首先服務(wù)器先設(shè)置session或cookie
?? 設(shè)置后再回復(fù)給瀏覽器讓瀏覽器存儲(chǔ)在內(nèi)存中的cookie里,然后在發(fā)送http請(qǐng)求時(shí)通過(guò)
?? http協(xié)議將瀏覽器cookie中的值帶入到服務(wù)器中,當(dāng)服務(wù)器檢測(cè)到值時(shí),程序就會(huì)繼續(xù)
?? 運(yùn)行下去,否則的話就是非法登錄.
?:session和cookie原理的詳細(xì)分析:
?? <h4>session:</h4>
?? 瀏覽器通過(guò)登錄頁(yè)面發(fā)送http請(qǐng)求發(fā)送到服務(wù)器,這時(shí)候服務(wù)器處理登錄請(qǐng)求,
?? 當(dāng)服務(wù)器解析到session_start時(shí)就會(huì)在服務(wù)器的temp文件夾里新建一個(gè)空的加密過(guò)的文件
?? 這時(shí)候就已經(jīng)成功將session存儲(chǔ)在了服務(wù)器里,只不過(guò)還沒(méi)有回復(fù)給瀏覽器,
?? 因?yàn)榉?wù)器還沒(méi)有將這個(gè)登錄處理頁(yè)面解析完畢,這時(shí)候程序繼續(xù)向下執(zhí)行,會(huì)進(jìn)行數(shù)據(jù)庫(kù)
?? 查詢,查詢之后將用戶名和用戶ID值寫(xiě)入session(‘user’,$user)里面,這時(shí)候就會(huì)將這個(gè)
?? 值寫(xiě)入到之前session_start()新建的空文件里,這時(shí)候之前建的這個(gè)文件就在是空的了
?? 如果這時(shí)候不跳轉(zhuǎn)頁(yè)面程序退出了話,就相當(dāng)于服務(wù)器將這個(gè)頁(yè)面解析完畢了,這時(shí)候就會(huì)通過(guò)http協(xié)議
?? 將session值回復(fù)給瀏覽器通知瀏覽器將session存在瀏覽器的cookie里,但是這時(shí)候在服務(wù)器的
?? 登錄處理頁(yè)面還打印不出來(lái)session里面的值,因?yàn)榉?wù)器要想得到session里面的值,
?? 必須通過(guò)瀏覽器發(fā)送http協(xié)議將存儲(chǔ)在瀏覽器中的cookie值發(fā)送到服務(wù)器后,服務(wù)器才能讀取到,
?? 服務(wù)器讀取到來(lái)自瀏覽器的cookie值,這時(shí)候就會(huì)和服務(wù)器之前建的文件名作對(duì)比,如果匹配的話
?? 服務(wù)器就會(huì)將session里面的值打印出來(lái)顯示在瀏覽器的頁(yè)面上,這時(shí)已經(jīng)成功設(shè)置了session
?? 只要瀏覽器不關(guān)閉內(nèi)存中的cookie值就不會(huì)消失,每次發(fā)送http請(qǐng)求時(shí)就會(huì)將內(nèi)存中的cookie值帶入到服務(wù)器
?? 無(wú)論請(qǐng)求那個(gè)頁(yè)面內(nèi)存中的cookie值就會(huì)帶到服務(wù)器,這時(shí)候服務(wù)器就會(huì)對(duì)比之前存的session,
?? 如果和服務(wù)器的文件名匹配就可以操作,存儲(chǔ)在服務(wù)器文件里的session數(shù)組值了,
?? 存儲(chǔ)在服務(wù)器的session值默認(rèn)存儲(chǔ)24分鐘,如果超過(guò)24分鐘就會(huì)自動(dòng)刪除了,這時(shí)候在不關(guān)閉瀏覽器的情況下
?? 服務(wù)器的session消失了,這時(shí)候?yàn)g覽器再發(fā)送http請(qǐng)求的話,將內(nèi)存中的cookie發(fā)送到服務(wù)器,但是這時(shí)候
?? 服務(wù)器是沒(méi)法和瀏覽器發(fā)送過(guò)來(lái)的session名作對(duì)比的,對(duì)比不成功的話服務(wù)器就不能操作session值了
?? 只有對(duì)比成功的話服務(wù)器才會(huì)將存儲(chǔ)在temp文件夾下的session文件里面的值讀取出來(lái),讀取出來(lái)后頁(yè)面在
?? 檢測(cè)session是否為空時(shí),就會(huì)通過(guò)檢測(cè)了,而且讀取出來(lái)的是用戶名和用戶的ID值,因?yàn)轫?yè)面檢測(cè)的是
?? session里面的是值是否為空,這時(shí)候如果在服務(wù)器里將session文件里面的文件清空,這時(shí)候也相當(dāng)于session為空了
?? 同樣也屬于非法登錄了
?? <h4>cookie:</h4>
?? 瀏覽器發(fā)送http請(qǐng)求給服務(wù)器服務(wù)器處理登錄請(qǐng)求,這時(shí)候服務(wù)器在解析到setcookie()時(shí)
?? 服務(wù)器會(huì)將setcookie()里面的值存儲(chǔ)在服務(wù)器里面,當(dāng)頁(yè)面解析完畢后服務(wù)器會(huì)將setcookie()里面的值
?? 回復(fù)給瀏覽器,瀏覽器就會(huì)自覺(jué)的將這個(gè)值存在瀏覽器的cookie里,當(dāng)瀏覽器再次發(fā)送http請(qǐng)求時(shí),只要瀏覽器內(nèi)存中的
?? cookie值不消失就會(huì)隨著http請(qǐng)求發(fā)送給服務(wù)器,服務(wù)器接收到瀏覽器發(fā)來(lái)的cookie值后會(huì)和之前存儲(chǔ)的cookie值作對(duì)比
?? 如果對(duì)比成功就會(huì)可以跳轉(zhuǎn)頁(yè)面了,之所以說(shuō)cookie不安全時(shí)是因?yàn)?#xff0c;cookie的值是明文顯示而且是由PHP進(jìn)行設(shè)置,對(duì)比的時(shí)候
?? 也是PHP語(yǔ)言加密方式和瀏覽器之間作對(duì)比,即使通過(guò)base64_encode()函數(shù)加密通過(guò)base64_decode()函數(shù)解密,
?? 但是這樣即使是加密過(guò)的也可以通過(guò)解密函數(shù)將其解密,當(dāng)然如果是層層加密的話就不好解密了,但是這樣還沒(méi)有session安全
?? 因?yàn)閟ession是服務(wù)器沒(méi)有通過(guò)任何加密方式分配的session文件,而且24分鐘自動(dòng)刪除,不會(huì)被偽造也不會(huì)重復(fù),而且瀏覽器里
?? 存儲(chǔ)的cookie只是一個(gè)引路者的角色,當(dāng)瀏覽器將內(nèi)存中的cookie帶到服務(wù)器后,
?? 服務(wù)器對(duì)比后才會(huì)把存儲(chǔ)在服務(wù)器文件夾里的session文件里的值調(diào)取出來(lái),cookie存儲(chǔ)服務(wù)器的值時(shí)固定不變的,
?? 而且不會(huì)刪除,但是session存服務(wù)器的值時(shí)隨機(jī)分配的session文件,所以說(shuō)cookie可以偽造了
轉(zhuǎn)載于:https://www.cnblogs.com/wy521/p/7702244.html
總結(jié)
以上是生活随笔為你收集整理的cookie和session原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux下安装python dlib依
- 下一篇: JavaScript高级程序设计之基本概