主頁 > 軟體設計 > 【快速學習系列,圖文并茂】HTTP的GET和POST、Cookie和Session

【快速學習系列,圖文并茂】HTTP的GET和POST、Cookie和Session

2021-10-26 07:50:50 軟體設計

快速導航

  • 前言
  • 一、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協議實作的,在此基礎上進行一個完整包裝,就是用于網路傳輸的協議標準了,
C/S通信
在我們瀏覽網站、登錄的操作中,就涉及到HTTP的資料傳輸,get和post就是最基本的動作,不過,get和post的特點有哪些、有什么區別,估計能回答一二,而更具體的內容,你還知道哪些呢?
Request和Response
另外,HTTP是無狀態協議,如何記住用戶的登錄狀態呢?**cookie和session,**就是其中的解決方案,

一、HTTP協議中GET和POST

1. get比post快

get耗時為post的2/3,看一看它們的作業程序就明白了,

post請求程序

  1. 瀏覽器請求tcp連接(第一次握手)
  2. 服務器答應進行tcp連接(第二次握手)
  3. 瀏覽器確認,并發送post請求頭(第三次握手,這個報文比較小,所以http會在此時進行第一次資料發送)
  4. 服務器回傳100 continue回應
  5. 瀏覽器開始發送資料
  6. 服務器回傳200 ok回應

POST

這里可見,post的作業程序是完成三次握手之后,才進行資料的傳輸,post請求的目的大多數是提交表單資料,第3和4步更好地驗證資料的完整性

再來看看get請求程序,

get請求程序

  1. 瀏覽器請求tcp連接(第一次握手)
  2. 服務器答應進行tcp連接(第二次握手)
  3. 瀏覽器確認,并發送get請求頭和資料
  4. 服務器回傳200 ok回應

GET
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無狀態協議
當我們瀏覽商品網站,準備購買商品,會登錄賬號,選擇一件商品,正要點擊下單,但是說了HTTP是無狀態的.

下單這個操作如何正確識別是哪個用戶呢

如何記住用戶的登錄狀態呢?cookie和session,就是其中的解決方案,

二、COOKIE和SESSION

1、cookie和session的關系

由于HTTP協議是無狀態的協議,所以服務端需要記錄用戶的狀態時,就需要用某種機制來識別用戶身份,這個機制就是session

因此,服務端要為特定的用戶創建特定的session用于標識這個用戶,并且跟蹤用戶行為,

在上面購買商品的例子中,服務端會創建該用戶的session,保持會話狀態,而在服務端的實作,則是將session保存在,快取記憶體或資料庫等,

說到這里,服務端到底是如何知道用戶特點,來進行標識呢?——這就引申出cookie機制HTTP狀態管理機制

session管理和cookie狀態管理

2、cookie機制

先來看看HTTP的首部欄位資訊,包含用戶的資訊,

首部名稱型別描述
From請求用戶email地址
User-Agent請求用戶的瀏覽器軟體(名稱+版本)
Referer請求從頁面鏈接跳轉過來的
Authorization請求用戶名和密碼
Client-IP擴展(請求)客戶端IP地址
X-Forwarded-For擴展客戶端IP地址
Cookie擴展服務器產生的ID標簽

由此看出,首部的這些欄位資訊,目的都是來標識一個用戶,保證服務端可以識別身份資訊,

Client IP(客戶端IP)為例,早期可以作為一種標識使用,前提保證每個用戶都有不同的IP地址,

現在,這種方法肯定不可行,識別用戶存在許多缺點:

  1. IP地址是標識機器的,如果多個用戶使用同一臺機器,則無法區分,
  2. ISP動態分配IP地址,每次登錄得到不同的地址,
  3. 為了提高安全性,并對稀缺的地址資源進行管理,都會通過NAT防火墻隱藏實際IP地址,轉換為一個共享的防火墻IP地址,
  4. 客戶端通過會經過網關、代理服務器,Web服務器得到的不是客戶端IP地址,

cookie,實際上是一小段的文本資訊,客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie,客戶端瀏覽器會把Cookie保存起來,

當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器,服務器檢查該Cookie,以此來辨認用戶狀態,

cookie資訊

  1. Set-Cookie:一個的cookie名和cookie值,

  2. Expires:可選的,過期時間,

  3. Domain:指定域,如baidu.com,至少包含二級域名,避免出現.com、.cn、.org

  4. Path:URL后面指定路徑,例如'/'匹配域名下所有內容,/list匹配list下的內容

  5. 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 nameCookie的名稱,Cookie一旦創建,名稱便不可更改
Object valueCookie的值,如果值為Unicode字符,需要為字符編碼,如果值為二進制資料,則需要使用BASE64編碼
int maxAgeCookie失效的時間單位秒,如果為正數,則該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 versionCookie使用的版本號,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檔案上傳專案超詳細

下一篇:CentOS8.x上安裝Nginx、配置SSL證書、配置端反向代理、域名到不同埠

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more