快速導航
- 前言
- 一、HTTP協議中GET和POST
- 1. get比post快
- 2.get是安全冪等性的
- 3.get/post本質都是TCP連接
- 二、COOKIE和SESSION
- 1、cookie和session的關系
- 2、cookie機制
- 3、session
- 三、總結
前言

今天是一年一度“1024”程式員節,各位大佬節日快樂,繼續碼!!
本篇主要總結的就是HTTP的應用,HTTP是應用層的協議,本質是基于傳輸層的TCP協議實作的,在此基礎上進行一個完整包裝,就是用于網路傳輸的協議標準了,

在我們瀏覽網站、登錄的操作中,就涉及到HTTP的資料傳輸,get和post就是最基本的動作,不過,get和post的特點有哪些、有什么區別,估計能回答一二,而更具體的內容,你還知道哪些呢?

另外,HTTP是無狀態協議,如何記住用戶的登錄狀態呢?**cookie和session,**就是其中的解決方案,
一、HTTP協議中GET和POST
1. get比post快
get耗時為post的2/3,看一看它們的作業程序就明白了,
post請求程序
- 瀏覽器請求tcp連接(第一次握手)
- 服務器答應進行tcp連接(第二次握手)
- 瀏覽器確認,并發送post請求頭(第三次握手,這個報文比較小,所以http會在此時進行第一次資料發送)
- 服務器回傳100 continue回應
- 瀏覽器開始發送資料
- 服務器回傳200 ok回應

這里可見,post的作業程序是完成三次握手之后,才進行資料的傳輸,post請求的目的大多數是提交表單資料,第3和4步更好地驗證資料的完整性,
再來看看get請求程序,
get請求程序
- 瀏覽器請求tcp連接(第一次握手)
- 服務器答應進行tcp連接(第二次握手)
- 瀏覽器確認,并發送get請求頭和資料
- 服務器回傳200 ok回應

get操作主要用來獲取資料,然后呈現給用戶,它確認服務器連接之后,第三步就開始傳輸資料了,
現在從get和post的請求程序看,post需要6步完成,get需要4步完成,
因此,get耗時大概為post的2/3,
2.get是安全冪等性的
安全是指不會修改資料,這里的安全并不是指資料傳輸程序中的安全,
冪等性意味著對同一URL的多個請求應該回傳同樣的結果,用戶對于同一操作發起的一次請求或者多次請求的結果是一致的,不會因為多次點擊而產生了副作用,
比如,數學中的冪等函式:絕對值,abs(x) = abs(abs(x))
日常應用中的冪等:線上支付,
分布式中的冪等:kafka資料提交的冪等性,
3.get/post本質都是TCP連接
只是在HTTP的規定和各種瀏覽器/服務器的限制,才出現在應用中有所不同,
前面是HTTP的基本操作,在客戶端/瀏覽器與服務器的通信中GET和POST的特點和區別,
HTTP是無狀態協議,一次GET或者POST之后,兩邊就此結束剛剛的通信狀態,請求和回應狀態都不會保存下來,

當我們瀏覽商品網站,準備購買商品,會登錄賬號,選擇一件商品,正要點擊下單,但是說了HTTP是無狀態的.
下單這個操作如何正確識別是哪個用戶呢
如何記住用戶的登錄狀態呢?cookie和session,就是其中的解決方案,
二、COOKIE和SESSION
1、cookie和session的關系
由于HTTP協議是無狀態的協議,所以服務端需要記錄用戶的狀態時,就需要用某種機制來識別用戶身份,這個機制就是session,
因此,服務端要為特定的用戶創建特定的session,用于標識這個用戶,并且跟蹤用戶行為,
在上面購買商品的例子中,服務端會創建該用戶的session,保持會話狀態,而在服務端的實作,則是將session保存在,快取記憶體或資料庫等,
說到這里,服務端到底是如何知道用戶特點,來進行標識呢?——這就引申出cookie機制(HTTP狀態管理機制)

2、cookie機制
先來看看HTTP的首部欄位資訊,包含用戶的資訊,
| 首部名稱 | 型別 | 描述 |
|---|---|---|
| From | 請求 | 用戶email地址 |
| User-Agent | 請求 | 用戶的瀏覽器軟體(名稱+版本) |
| Referer | 請求 | 從頁面鏈接跳轉過來的 |
| Authorization | 請求 | 用戶名和密碼 |
| Client-IP | 擴展(請求) | 客戶端IP地址 |
| X-Forwarded-For | 擴展 | 客戶端IP地址 |
| Cookie | 擴展 | 服務器產生的ID標簽 |
由此看出,首部的這些欄位資訊,目的都是來標識一個用戶,保證服務端可以識別身份資訊,
以Client IP(客戶端IP)為例,早期可以作為一種標識使用,前提保證每個用戶都有不同的IP地址,
現在,這種方法肯定不可行,識別用戶存在許多缺點:
- IP地址是標識機器的,如果多個用戶使用同一臺機器,則無法區分,
- ISP動態分配IP地址,每次登錄得到不同的地址,
- 為了提高安全性,并對稀缺的地址資源進行管理,都會通過NAT防火墻來隱藏實際IP地址,轉換為一個共享的防火墻IP地址,
- 客戶端通過會經過網關、代理服務器,Web服務器得到的不是客戶端IP地址,
cookie,實際上是一小段的文本資訊,客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie,客戶端瀏覽器會把Cookie保存起來,
當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器,服務器檢查該Cookie,以此來辨認用戶狀態,

-
Set-Cookie:一個的cookie名和cookie值,
-
Expires:可選的,過期時間,
-
Domain:指定域,如baidu.com,至少包含二級域名,避免出現.com、.cn、.org
-
Path:URL后面指定路徑,
例如'/'匹配域名下所有內容,/list匹配list下的內容, -
Secure:說明只有在HTTP使用SSL安全連接時才會發送cookie,
Java中把Cookie封裝成了javax.servlet.http.Cookie類,主要的屬性和方法如下表格:
Cookie cookie = new Cookie("username","hello");// 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE);// 設定失效時間
cookie.setPath("/list/"); //設定路徑
cookie.setSecure(true);//設定安全性
response.addCookie(cookie);// 添加發送到客戶端
| 屬 性 名 | 描 述 |
|---|---|
| String name | 該Cookie的名稱,Cookie一旦創建,名稱便不可更改 |
| Object value | 該Cookie的值,如果值為Unicode字符,需要為字符編碼,如果值為二進制資料,則需要使用BASE64編碼 |
| int maxAge | 該Cookie失效的時間,單位秒,如果為正數,則該Cookie在maxAge秒之后失效,如果為負數,該Cookie為臨時Cookie,關閉瀏覽器即失效,瀏覽器也不會以任何形式保存該Cookie,如果為0,表示洗掉該Cookie,默認為–1, |
| boolean secure | 該Cookie是否僅被使用安全協議傳輸,安全協議,安全協議有HTTPS,SSL等,在網路上傳輸資料之前先將資料加密,默認為false |
| String path | 該Cookie的使用路徑,如果設定為“/sessionWeb/”,則只有contextPath為“/sessionWeb”的程式可以訪問該Cookie,如果設定為“/”,則本域名下contextPath都可以訪問該Cookie,注意最后一個字符必須為“/” |
| String domain | 可以訪問該Cookie的域名,如果設定為“.google.com”,則所有以“google.com”結尾的域名都可以訪問該Cookie,注意第一個字符必須為“.” |
| String comment | 該Cookie的用處說明,瀏覽器顯示Cookie資訊的時候顯示該說明 |
| int version | 該Cookie使用的版本號,0表示遵循Netscape的Cookie規范,1表示遵循W3C的RFC 2109規范 |
另外,cookie中設定了HttpOnly屬性,js腳本將無法讀取到cookie資訊,這樣能有效地防止XSS攻擊,竊取cookie內容,這樣就增加了cookie的安全性,
response.setHeader( "Set-Cookie" , "cookiename=httponlyTest;Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
3、session
Session是另一種記錄客戶狀態的機制,保存在服務器上,客戶端瀏覽器訪問服務器的時候,服務器把客戶端資訊以某種形式記錄在服務器上,這就是Session,客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了,
對比之下,cookie像是個人身份證,session像是檔案表,
Java中的javax.servlet.http.HttpSession類,
HttpSession session = request.getSession();// 獲取Session物件
session.setAttribute("loginTime", new Date());// 設定Session中的屬性
總結下來,cookie和session的特點是:
Cookie是客戶端保存用戶資訊的一種機制,用來記錄用戶的一些資訊(賬號密碼、sessionID),也是實作Session的一種方式,
Session是在服務端保存的一個資料結構,用來跟蹤用戶的狀態,這個資料可以保存在快取集群、資料庫、檔案中,
三、總結
這一篇總結的內容就是HTTP的基本操作GET和POST的詳細特點,HTTP的無狀態性,使得在get/post之后,沒有記錄會話狀態,因此,引申出cookie和session的解決方案,
閱讀之后,相信會有所識訓,更好地梳理了這部分知識,面試時候如行云流水,offer++!

如果覺得不錯歡迎“一鍵三連”哦,點贊收藏關注,評論提問建議,歡迎交流學習!一起加油進步,我們下篇見!
本篇內容首發我的CSDN博客:https://csdn-czh.blog.csdn.net/article/details/120931996
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/336207.html
標籤:其他
上一篇:騰訊云服務器安裝寶塔面板并把node+vue部署到云服務器,vue+elementUI+node檔案上傳專案超詳細
