cookie與session詳解

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的.</font>
. 在設置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的注意事項

.安全性,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的管理機制是不是一樣.

原文轉自

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276678.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276678.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276678.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++萬能頭文件_初學Python,與C對比

?背景學了一學年的C的基礎&#xff0c;下學年開課Python&#xff0c;現在正在自學中...C也不是不學了&#xff0c;而是之前買了一本《CPrimer》在學校里&#xff0c;就準備先學一下Python&#xff0c;下學期利用自由時間接著學習C。這里分析了一下二者的優缺點&#xff0c;供大…

listen(int fd, int backlog)中的backlog含義

1. listen(int fd, int backlog)中的backlog不能限制連接數量??? http://bbs.chinaunix.net/viewthread.php?tid870564 backlog應該是未完成3次握手連接和已完成3次握手而未被accept的兩對列之和.不知道我說的對不? 如果要控制連接數量,是不是要自己編碼控制...下面的可以…

本地無法啟動MySQL服務,報的錯誤:1067,進程意外終止---解決

原文鏈接&#xff1a;http://blog.csdn.net/shenhonglei1234/article/details/5928873 在本地計算機無法啟動MYSQL服務錯誤1067進程意外終止 這種情況一般是my.ini文件配置出錯了 首先找到這個文件&#xff1a; 默認安裝路徑 C:/Program Files/MySQL/MySQL Server 5.1/my.ini …

一篇文章助你理解Python3中字符串編碼問題

前幾天給大家介紹了unicode編碼和utf-8編碼的理論知識&#xff0c;以及Python2中字符串編碼問題&#xff0c;沒來得及上車的小伙伴們可以戳這篇文章&#xff1a;淺談unicode編碼和utf-8編碼的關系和一篇文章助你理解Python2中字符串編碼問題。下面在Python3環境中進行代碼演示&…

Express框架開發知識點總結

express --viewpug myapp 以上語句在當前工作目錄中創建名為 myapp 的 Express 應用程序&#xff0c;采用的模板是jade。 以前還在糾結使用hbs模板引擎或者ejs模板&#xff0c;實際上只要將--view后面的pug換成hbs&#xff08;使用的是Handlebars模板引擎&#xff09;&#xff…

《高級軟件架構師講義》學習筆記5

第五章 設計模式與軟件架構設計 一、面向對象軟件架構設計思想 a) 面向對象范式 i. 面向對象范式的核心是“對象”的概念 ii. 所有的東西都聚焦于對象 iii. 圍繞對象-而非函數-組織代碼 b) 對象從不同視角觀察 i. 概念層&#xff1a;…

python 安裝xpath_Python網絡爬蟲(四)- XPath1.XPath2.XPath在python中的應用

目錄&#xff1a; 1.XPath XPath即為XML路徑語言&#xff08;XML Path Language&#xff09;&#xff0c;它是一種用來確定XML文檔中某部分位置的語言。它使用路徑表達式來選取 XML 文檔中的節點或節點集。節點是通過沿著路徑 (path) 或者步 (steps) 來選取的。 XPath語法 2.XP…

團隊升級

2019獨角獸企業重金招聘Python工程師標準>>> 轉載于:https://my.oschina.net/yulongblog/blog/2988702

設計模式簡介

深入理解面向對象 向下&#xff1a;深入理解三大面向對象機制 封裝&#xff0c;隱藏內部實現 繼承&#xff0c;復用現有代碼  多態&#xff0c;改寫對象行為 向上&#xff1a;深刻把握面向對象機制所帶來的抽象意義&#xff0c;理解如何使用這些機制來表達現實世界&#xff0c…

Css3: gradient背景漸變

Css3: gradient背景漸變 原文鏈接&#xff1a;http://kk073000.blog.163.com/blog/static/34826942012123111322691/ css3實現了背景漸變。 <gradient> [ <linear-gradient> | <radial-gradient> | <repeating-linear-gradient> | <repeating-r…

模板方法

重構的關鍵技法&#xff1a; 靜態 -> 動態 早綁定 -> 晚綁定 繼承 -> 組合 編譯時依賴 -> 運行時依賴 緊耦合 -> 松耦合 "組件協作"模式 現代軟件專業分工之后的第一個結果是“框架與應用程序的劃分”&#xff0c;“組件協作”模式通過晚期綁定&#…

聚類 python_python中實現k-means聚類算法詳解

算法優缺點&#xff1a; 優點&#xff1a;容易實現 缺點&#xff1a;可能收斂到局部最小值&#xff0c;在大規模數據集上收斂較慢 使用數據類型&#xff1a;數值型數據 算法思想 k-means算法實際上就是通過計算不同樣本間的距離來判斷他們的相近關系的&#xff0c;相近的就會放…

python筆試常見題

1、冒泡排序&#xff1a; 冒泡排序算是最基本的python算法了。也算python面試遇到問的最多的了。 如果是封裝成函數。代碼如下&#xff1a; 如果初始就一個字典。那么代碼為&#xff1a; 冒泡排序的本質就是兩兩比較。根據結果調換位置。最終達到一個排序的效果。 注&#xff1…

固定資產打開提示:上年度數據未結轉!

問題現象&#xff1a;固定資產打開提示&#xff1a;上年度數據未結轉&#xff01; 問題分析&#xff1a;服務器出問題后&#xff0c;數據庫UFSYSTEM丟失&#xff0c;重新建賬后年度數據覆蓋后出現的&#xff0c;那么問題應該出在UFSYSTEM庫UA_ACCOUNT_SUB表與年度庫Accinformat…

windows MySQL 5+ 服務手動安裝

MySQL 5 服務手動安裝的方法&#xff1a;運行cmd&#xff0c;進入mysql的安裝目錄&#xff1a; C:\Users\aministrator> D: D:\> cd MySQL Server 5.6\bin D:\MySQL Server 5.6\bin>在bin目錄中運行mysqld.exe -install命令&#xff0c;安裝不完成會有提示信息。#1、手…

Kotlin防止按鈕多次點擊

剛開始寫kotlin 這段代碼寫的可能有問題 望指正 object ViewClickDelay {var hash: Int 0var lastClickTime: Long 0var SPACE_TIME: Long 3000 }infix fun View.clickDelay(clickAction: () -> Unit) {this.setOnClickListener {if (this.hashCode() ! hash) {hash thi…

C#網絡編程(同步傳輸字符串) - Part.2

服務端客戶端通信 在與服務端的連接建立以后&#xff0c;我們就可以通過此連接來發送和接收數據。端口與端口之間以流&#xff08;Stream&#xff09;的形式傳輸數據&#xff0c;因為幾乎任何對象都可以保存到流中&#xff0c;所以實際上可以在客戶端與服務端之間傳輸任何類型的…

Factory Method工廠方法

“對象創建“模式 通過”對象創建“模式繞開new&#xff0c;來避免對象創建(new)過程中所導致的緊耦合&#xff08;以來具體類&#xff09;&#xff0c;從而支持對象創建的穩定。它是接口抽象之后的第一部工作。 典型模式&#xff1a;Factory Method&#xff0c;Abstract Facto…

centos 關閉防火墻_CentOS7操作系統下如何關閉防火墻

centos系統如果不關閉防火墻在使用中會遇到不少問題&#xff0c;而且centos7和centos6關閉防火墻的方式不一樣。centos6:1.永久性生效&#xff0c;重啟后不會復原開啟&#xff1a; chkconfig iptables on關閉&#xff1a; chkconfig iptables off2.即時生效&#xff0c;重啟后復…

web 網頁按比例顯示圖片 js

原文鏈接&#xff1a;http://blog.csdn.net/liqinghuiyx/article/details/5442349 在動態站點上經常需要上傳自己的圖片&#xff0c;而這些圖片的大小是未知的&#xff0c;在顯示成縮略圖的時候必須進行按比例的縮放才能美觀地顯示。以最近做的golf網站&#xff08;http://www…