HTTP之cookie基礎學習

目錄

Cookie

什么是Cookie

Cookie分類

Cookie版本

Cookie工作原理

Cookie詳解

創建cookie

cookie編碼

cookie過期時間選項

Cookie流程

Cookie使用

會話管理

個性化信息

記錄用戶的行為

Cookie屬性

domain選項

path選項

secure選項

cookie使用失效日期

httponly

cookie自動刪除

Cookie的缺陷

HTTP Cookie總結

HTTP Session工作流程總結

傳輸安全

Session和Cookie的區別

報文分類與格式

HTTP響應報文

狀態行(Status-Line)

響應頭部(Response Header Fields)

消息體(Message Body)

Cookie

什么是Cookie

HTTP Cookie(也叫 Web Cookie 或瀏覽器 Cookie)是服務器發送到用戶瀏覽器并保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶并發送到服務器上。

通常,它用于告知服務端兩個請求是否來自同一瀏覽器,如保持用戶的登錄狀態。Cookie 使基于無狀態的 HTTP?協議記錄穩定的狀態信息成為了可能。

Cookie分類

會話 Cookie會話 Cookie 是臨時 Cookie,當前會話結束(瀏覽器退出)時 Cookie 會被刪除。會話 Cookie 和持久 Cookie 的區別在于過期時間,如果設置了 Discard 參數(Cookie 版本1)或者沒有設置 Expires(Cookie 版本 0)或 Max-Age(Cookie 版本1)設置過期時間,則此 Cookie 為會話 Cookie。

持久 Cookie持久 Cookie 會存儲在用戶的硬盤上,瀏覽器(客戶端)退出,然后重新啟動后 Cookie 仍然存在。

Cookie版本

Cookie 有兩個版本,一個是版本 0(Netscape Cookies)和版本 1(RFC 2965),目前大多數服務器使用的 Cookie 0。

Cookie工作原理

Cookie 就像服務器給用戶貼的標簽,用戶訪問一個 web 站點的時候,服務器就可以通過這個標簽來識別是哪一個用戶。Cookie 中包含了一個有名字=值(name=value)這樣的信息構成的任意列表,并通過 Set-Cookie?或 Set-Cookie2 Http 響應(擴展)的 header 來設置標簽。

cooke 可以包含任意信息,但他們通常都只包含一個服務器為了進行追蹤而產生的獨特的識別碼。瀏覽器會記住從服務器返回的 Set-Cookie 或 Set-Cookie2 header 中的 Cookie 內容,并將 Cookie 集存儲在瀏覽器的 Cookie 數據庫中。將來用戶訪問統一站點時,瀏覽器會選中那個服務器貼到用戶上的那些 Cookie,并請求的 header 中將起傳給服務器。

Cookie詳解

創建cookie

Web 服務器通過發送一個稱為?Set-Cookie 的 HTTP 消息頭來創建一個 cookie,Set-Cookie 消息頭是一個字符串,其格式如下(中括號中的部分是可選的):

Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

消息頭的第一部分,value 部分,通常是一個 name=value 格式的字符串。事實上,這種格式是原始規范中指定的格式,但是瀏覽器并不會對 cookie 值按照此格式來驗證。實際上,你可以指定一個不含等號的字符串,它同樣會被存儲。然而,最常用的使用方式是按照 name=value 格式來指定 cookie 的值(大多數接口只支持該格式)。

當存在一個 cookie,并允許設置可選項,該 cookie 的值會在隨后的每次請求中被發送至服務器,cookie 的值被存儲在名為 Cookie 的 HTTP 消息頭中,并且只包含了 cookie 的值,忽略全部設置選項。例如:

Cookie: value

通過 Set-Cookie 指定的可選項只會在瀏覽器端使用,而不會被發送至服務器端。發送至服務器的 cookie 的值與通過 Set-Cookie 指定的值完全一樣,不會有進一步的解析或轉碼操作。如果請求中包含多個 cookie,它們將會被分號和空格分開,例如:

Cookie: value1; value2; name1=value1

服務器端框架通常包含解析 cookie 的方法,可以通過編程的方式獲取 cookie 的值。

cookie編碼

對于 cookie 的值進行編碼一直都存在一些困惑。普遍認為 cookie 的值必須經過 URL 編碼,但其實這是一個謬論,盡管通常都這么做。原始規范中明確指出只有三個字符必須進行編碼:分號、逗號和空格,規范中還提到可以進行 URL 編碼,但并不是必須,在 RFC 中沒有提及任何編碼。然而,幾乎所有的實現都對 cookie 的值進行了一系列的 URL 編碼。對于 name=value 格式,通常會對 name 和 value 分別進行編碼,而不對等號 = 進行編碼操作。

cookie過期時間選項

緊跟 cookie 值后面的每個選項都以分號和空格分開,每個選擇都指定了 cookie 在什么情況下應該被發送至服務器。第一個選項是過期時間(expires),指定了 cookie 何時不會再被發送至服務器,隨后瀏覽器將刪除該 cookie。該選項的值是一個 Wdy, DD-Mon-YYYY HH:MM:SS GMT 日期格式的值,例如:

Set-Cookie: name=Nicholas; expires=Sat, 02 May 2009 23:38:25 GMT

沒有設置 expires 選項時,cookie 的生命周期僅限于當前會話中,關閉瀏覽器意味著這次會話的結束,所以會話 cookie 僅存在于瀏覽器打開狀態之下。這就是為什么為什么當你登錄一個 Web 應用時經常會看到一個復選框,詢問你是否記住登錄信息:如果你勾選了復選框,那么一個 expires 選項會被附加到登錄 cookie 中。如果 expires 設置了一個過去的時間點,那么這個 cookie 會被立即刪掉。

Cookie流程

大部分 web 網站都會使用到 cookie,使用它的基本流程可以概括為 3 步,瀏覽器向服務器請求一個從未請求過的 web 頁面:

GET?/index.html?HTTP/1.1Host: www.haicoder.net

...

瀏覽器會在接下來的 http 請求的 header 中把以上 cookie 原樣返回給服務器:

HTTP/1.0 200?OKContent-type: text/htmlSet-Cookie: theme=lightSet-Cookie: sessionToken=abc123; Expires=Wed, 09 Jun 2020 10:18:14 GMT

...

服務器返回瀏覽器此頁面,并在返回 http 包的 header 中設置 set-cookie 屬性:

GET?/spec.html?HTTP/1.1Host: www.haicoder.netCookie: theme=light; sessionToken=abc123

上面示例設置了兩個 cookies: 第一個是 theme,由于沒有設置它的 Expires 或 Max-Age 屬性,所以是個 session cookie,它會在瀏覽器關閉時直接被刪除掉。 第二個是 SessionToken,它有過期時間,所以只會在指定的過期時間后才會被刪除(也可手動刪除)。

瀏覽器訪問時,會把上一步的 cookies 設置在 header 中原樣返回給服務器,當然不需要再指定 cookie 的其它屬性,只需要把 key-value 返回即可。服務器根據設置的 cookies 就能知道標識這個客戶,把無狀態的 HTTP 請求變成了有狀態的請求。

瀏覽器的 Cookie 頭部信息如下:

Cookie使用

會話管理

  1. 記錄用戶的登錄狀態是 cookie 最常用的用途。通常 web 服務器會在用戶登錄成功后下發一個簽名來標記 session 的有效性,這樣免去了用戶多次認證和登錄網站。
  2. 記錄用戶的訪問狀態,例如導航啊,用戶的注冊流程啊。

個性化信息

  1. Cookie 也經常用來記憶用戶相關的信息,以方便用戶在使用和自己相關的站點服務。例如:ptlogin 會記憶上一次登錄的用戶的 QQ 號碼,這樣在下次登錄的時候會默認填寫好這個 QQ 號碼。
  2. Cookie 也被用來記憶用戶自定義的一些功能。用戶在設置自定義特征的時候,僅僅是保存在用戶的瀏覽器中,在下一次訪問的時候服務器會根據用戶本地的 cookie 來表現用戶的設置。例如 google 將搜索設置(使用語言、每頁的條數,以及打開搜索結果的方式等等)保存在一個 COOKIE 里。

記錄用戶的行為

最典型的是公司的 TCSS 系統。它使用 Cookie 來記錄用戶的點擊流和某個產品或商業行為的操作率和流失率。當然功能可以通過 IP 或 http header 中的 referrer 實現,但是 Cookie 更精準一些。

Cookie屬性

一般 Cookie 所具有的屬性,包括:

domain選項

domain,指定了 cookie 將要被發送至哪個或哪些域中。默認情況下,domain 會被設置為創建該 cookie 的頁面所在的域名,所以當給相同域名發送請求時該 cookie 會被發送至服務器。domain 選項可用來擴充 cookie 可發送域的數量,例如:

Set-Cookie: name=Nicholas; domain=haicoder.net

像 Yahoo! 這種大型網站,都會有許多 name.yahoo.com 形式的站點(例如:my.yahoo.com, finance.yahoo.com 等等)。將一個 cookie 的 domain 選項設置為 yahoo.com,就可以將該 cookie 的值發送至所有這些站點。瀏覽器會把 domain 的值與請求的域名做一個尾部比較(即從字符串的尾部開始比較),并將匹配的 cookie 發送至服務器。domain 選項的值必須是發送 Set-Cookie 消息頭的主機名的一部分,例如我不能在 google.com 上設置一個 cookie,因為這會產生安全問題。不合法的 domain 選擇將直接被忽略。

path選項

另一個控制 Cookie 消息頭發送時機的選項是 path 選項,和 domain 選項類似,path 選項指定了請求的資源 URL 中必須存在指定的路徑時,才會發送 Cookie 消息頭。這個比較通常是將 path 選項的值與請求的 URL 從頭開始逐字符比較完成的。如果字符匹配,則發送 Cookie 消息頭,例如:

Set-Cookie:name=Nicholas;path=/blog

在這個例子中,path 選項值會與 /blog,/blogtool 等等相匹配;任何以 /blog 開頭的選項都是合法的。需要注意的是,只有在 domain 選項核實完畢之后才會對 path 屬性進行比較。path 屬性的默認值是發送 Set-Cookie 消息頭所對應的 URL 中的 path 部分。

secure選項

最后一個選項是 secure。不像其它選項,該選項只是一個標記而沒有值。只有當一個請求通過 SSL 或 HTTPS?創建時,包含 secure 選項的 cookie 才能被發送至服務器。這種 cookie 的內容具有很高的價值,如果以純文本形式傳遞很有可能被篡改,例如:

Set-Cookie: name=Nicholas; secure

事實上,機密且敏感的信息絕不應該在 cookie 中存儲或傳輸,因為 cookie 的整個機制原本都是不安全的。默認情況下,在 HTTPS 鏈接上傳輸的 cookie 都會被自動添加上 secure 選項。

cookie使用失效日期

當 cookie 創建時指定了失效日期,這個失效日期則關聯了以 name-domain-path-secure 為標識的 cookie。要改變一個 cookie 的失效日期,你必須指定同樣的組合。當改變一個 cookie 的值時,你不必每次都設置失效日期,因為它不是 cookie 標識信息的組成部分。例如:

Set-Cookie:name=Mike;expires=Sat,03 May 2025 17:44:22 GMT

現在已經設置了 cookie 的失效日期,所以下次我想要改變 cookie 的值時,我只需要使用它的名字:

Set-Cookie:name=Matt

cookie 的失效日期并沒有改變,因為 cookie 的標識符是相同的。實際上,只有你手工的改變 cookie 的失效日期,否則其失效日期不會改變。這意味著在同一個會話中,一個會話 cookie 可以變成一個持久化 cookie(一個可以在多個會話中存在的),反之則不可。為了要將一個持久化 cookie 變為一個會話 cookie,你必須刪除這個持久化 cookie,這只要設置它的失效日期為過去某個時間之后再創建一個同名的會話 cookie 就可以實現。

需要記得的是失效日期是以瀏覽器運行的電腦上的系統時間為基準進行核實的。沒有任何辦法來來驗證這個系統時間是否和服務器的時間同步,所以當服務器時間和瀏覽器所處系統時間存在差異時這樣的設置會出現錯誤。

httponly

表示此 Cookie 必須用于 http 或 https 傳輸。這意味著,瀏覽器腳本,比如 javascript?中,是不允許訪問操作此 Cookie 的。

cookie自動刪除

cookie 會被瀏覽器自動刪除,通常存在以下幾種原因:

  1. 會話 cooke (Session cookie) 在會話結束時(瀏覽器關閉)會被刪除。
  2. 持久化 cookie(Persistent cookie)在到達失效日期時會被刪除。
  3. 如果瀏覽器中的 cookie 數量達到限制,那么 cookie 會被刪除以為新建的 cookie 創建空間。

Cookie的缺陷

  • cookie 會被附加在每個 HTTP 請求中,所以無形中增加了流量。
  • 由于在 HTTP 請求中的 cookie 是明文傳遞的,所以安全性成問題。(除非用 HTTPS)
  • Cookie 的大小限制在 4KB 左右。對于復雜的存儲需求來說是不夠用的。

HTTP Cookie總結

HTTP Cookie(也叫 Web Cookie 或瀏覽器 Cookie)是服務器發送到用戶瀏覽器并保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶并發送到服務器上。

通常,它用于告知服務端兩個請求是否來自同一瀏覽器,如保持用戶的登錄狀態。Cookie 使基于無狀態的 HTTP 協議記錄穩定的狀態信息成為了可能。

HTTP Session工作流程總結

  • 瀏覽器第一次請求網站, 服務端生成 Session ID。
  • 把生成的 Session ID 保存到服務端存儲中。
  • 把生成的 Session ID 返回給瀏覽器,通過 set-cookie。
  • 瀏覽器收到 Session ID, 在下一次發送請求時就會帶上這個 Session ID。
  • 服務端收到瀏覽器發來的 Session ID,從 Session 存儲中找到用戶狀態數據,會話建立。
  • 此后的請求都會交換這個 Session ID,進行有狀態的會話。

傳輸安全

最后再聊聊傳輸安全,有一種叫做 Session ID 劫持的,假如 Session ID 是基于 HTTP 協議傳輸的,因為是明文傳輸,那么它就可能被中間的路由器劫持。 攻擊者得到 Session ID 后,把它帶到自己的請求中,就能夠進入你的賬戶。

所以一些 Web 框架還提供了 Session 的一些安全保護,比如間隔時間內動態刷新 Session ID,加上 Token 等

Session和Cookie的區別

  1. cookie 數據存放在客戶端,session 數據放在服務器上。
  2. cookie 不是很安全,別人可以分析存放在本地的 Cookie 并進行 Cookie 欺騙考慮到安全應當使用 session。
  3. session 會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能考慮到減輕服務器性能方面,應當使用 Cookie。
  4. 單個 Cookie 保存的數據長度不能超過 4K,很多瀏覽器都限制一個網址最多保存 20 個 cookie。
  5. 將登陸信息等重要信息存放為 SESSION,其他信息如果需要保留,可以放在 COOKIE 中。
  6. Session 的運行依賴 Session ID,而 Session ID 是存在 Cookie 中的,也就是說,如果瀏覽器禁用了 Cookie,Session 也會失效(但是可以通過其它方式實現,比如在 url 中傳遞 Session ID)。

報文分類與格式

所有的 HTTP 報文都可以分為兩類:請求報文和響應報文。請求和響應報文的基本報文結構相同。請求報文的格式:

<method> <request-URL> <version>

<headers>

<entity-body>

?

響應報文的格式(注意,只有起始行的語法有所不同):

<version> <status> <reason-phrase>

<headers>

<entity-body>

HTTP響應報文

一個 http 響應報文也由四個部分組成:

  1. 狀態行(Status-Line)
  2. 響應頭部(Response Header Fields)
  3. 回車換行(CRLF)
  4. 消息體(Message Body)

狀態行(Status-Line)

HTTP/1.1 200?OK

上面是一個典型的 http 響應狀態行,我們可以看到也是由三部分組成的:

  1. http 協議版本
  2. 狀態碼(Status Code)
  3. 狀態碼的文本描述(Reason-Phrase)

響應頭部(Response Header Fields)

和請求頭部類似,就是兩者之間有一些不同的頭部字段。

消息體(Message Body)

返回給客戶端的具體消息。

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

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

相關文章

帶著問題學習分布式系統

寫在前面 聽過很多道理&#xff0c;卻依然過不好這一生。 看過很多關于學習的技巧、方法&#xff0c;卻沒應用到自己的學習中。 隨著年紀變大&#xff0c;記憶力越來越差&#xff0c;整塊的時間也越來越少&#xff0c;于是&#xff0c;越來越希望能夠更高效的學習。學習是一種習…

香港大學余濤組推出開源XLANG Agent!支持三種Agent模式

作者 |小戲、ZenMoore 一個新的未來又逐漸開始從理論走向現實走到我們身邊了。 語言的意義在于使用&#xff0c;而從 ChatGPT 以來這些大規模語言模型的意義&#xff0c;也必然絕不止于 Chat&#xff0c;在四個月前&#xff0c;我們介紹了清華大學關于工具學習的綜述《清華發布…

Python-OpenCV中的圖像處理-圖像特征

Python-OpenCV中的圖像處理-圖像特征 圖像特征Harris角點檢測亞像素級精度的角點檢測Shi-Tomasi角點檢測SIFT(Scale-Invariant Feature Transfrom)SURF(Speeded-Up Robust Features) 圖像特征 特征理解特征檢測特征描述 Harris角點檢測 cv2.cornerHarris(img, blockSize, ks…

海格里斯HEGERLS四向穿梭車倉儲解決方案在電子商務行業中的應用

隨著現代物流&#xff0c;尤其是智能化物流的飛速發展&#xff0c;河北沃克金屬制品有限公司看到了智能物流領域背后的巨大價值和市場空間&#xff0c;深知物流與供應鏈對企業發展的重要性。于是&#xff0c;引進了先進的高科技智能技術—HEGERLS四向穿梭車技術&#xff0c;并迅…

【日常積累】Linux下文件亂碼解決

linux下刪除亂碼文件、目錄 由于編碼原因&#xff0c;在linux服務器上上傳、創建中文文件或目錄時&#xff0c;會產生亂碼&#xff0c;如果想刪除它&#xff0c;有時候發現用rm命令是刪除不了的 這種情況下&#xff0c;用find命令可以刪除亂碼的文件或目錄。 首先進入亂碼文件…

docker 網絡訪問診斷

本地docker開啟nginx服務等&#xff0c; 發現linux系統重啟之后&#xff0c;無法訪問&#xff0c; 進入容器內部&#xff0c;發現可以訪問 但是容器外部&#xff0c;映射端口無法訪問&#xff1b; 診斷之前&#xff0c;發現docker0沒有IP綁定 rootbook:/etc/docker# ip addr …

自制手寫機器人

寫字機器人模擬在畫圖板上寫字效果 寫了一套寫字機器人代碼&#xff0c;有多種字體可供選擇&#xff0c;需要的朋友私信獲取代碼和軟件

Spring5學習筆記— 工廠高級特性

?作者簡介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;熱愛Java后端開發者&#xff0c;一個想要與大家共同進步的男人&#x1f609;&#x1f609; &#x1f34e;個人主頁&#xff1a;Leo的博客 &#x1f49e;當前專欄&#xff1a; Spring專欄 ?特色專欄&#xff1a; M…

創建型模式-原型模式

文章目錄 一、原型模式1. 概述2. 結構3. 實現4. 案例1.5 使用場景1.6 擴展&#xff08;深克隆&#xff09; 一、原型模式 1. 概述 用一個已經創建的實例作為原型&#xff0c;通過復制該原型對象來創建一個和原型對象相同的新對象。 2. 結構 原型模式包含如下角色&#xff1a; …

微服務架構和分布式架構的區別

微服務架構和分布式架構的區別 有&#xff1a;1、含義不同&#xff1b;2、概念層面不同&#xff1b;3、解決問題不同&#xff1b;4、部署方式不同&#xff1b;5、耦合度不同。其中&#xff0c;含義不同指微服務架構是一種將一個單一應用程序開發為一組小型服務的方法&#xff…

使用windows搭建WebDAV服務,并內網穿透公網訪問【無公網IP】

文章目錄 1. 安裝IIS必要WebDav組件2. 客戶端測試3. 使用cpolar內網穿透&#xff0c;將WebDav服務暴露在公網3.1 打開Web-UI管理界面3.2 創建隧道3.3 查看在線隧道列表3.4 瀏覽器訪問測試 4. 安裝Raidrive客戶端4.1 連接WebDav服務器4.2 連接成功4.2 連接成功 1. Linux(centos8…

【Vue-Router】路由入門

路由&#xff08;Routing&#xff09;是指確定網站或應用程序中特定頁面的方式。在Web開發中&#xff0c;路由用于根據URL的不同部分來確定應用程序中應該顯示哪個內容。 構建前端項目 npm init vuelatest //或者 npm init vitelatest安裝依賴和路由 npm install npm instal…

TCP重連 - 筆記

1 C++ TCP/IP 關于tcp斷線重連的問題 C++ TCP/IP 關于tcp斷線重連的問題_c++ 斷線重連_Bug&猿柒。的博客-CSDN博客 2 C++基礎--完善Socket C/S ,實現客戶端,服務器端斷開重連 https://www.cnblogs.com/kingdom_0/articles/2571727.html 3 C++實現Tcp通信(考慮客戶…

ATF BL1 UFS初始化簡單分析

ATF BL1 UFS初始化分析 1 ATF的下載鏈接2 ATF BL1 UFS 初始化簡易流程圖3 ATF BL1 ufs初始化簡單過程分析3.1 調用過程3.2 hikey960_ufs_init3.3 dw_ufs_init3.3 ufs_init 以海思hikey960為例來介紹&#xff0c;簡單介紹在ATF BL1階段的初始化處理。 1 ATF的下載鏈接 https:/…

藍帽杯 取證2022

網站取證 網站取證_1 下載附件 并解壓 得到了一個文件以及一個壓縮包 解壓壓縮包 用火絨查病毒 發現后門 打開文件路徑之后 發現了一句話木馬 解出flag 網站取證_2 讓找數據庫鏈接的明文密碼 打開www文件找找 查看數據庫配置文件/application/database.php&#xff08;CodeI…

Vue3.2+TS的父傳子,子傳父

這是父組件 <template><div><!-- 這個fn是子組件emit觸發名&#xff0c;兩邊保持一致 --><Child :num"num" fn"numUp"></Child></div> </template><script setup lang"ts"> import { ref } fr…

截止到目前全量主體總數有多少?

企業主體類型 企業主體類型有很多種&#xff0c;一般我們會分為公司&#xff08;有限責任&#xff09;、合伙企業、個人獨資企業、個體經營戶這些類別。 今天我們按照企業&#xff0c;個體&#xff0c;組織的分類方式來看各個主體的總數。 企業&#xff1a;統一社會信用代碼…

基于IP網絡的存儲協議——iSCSI

文章首發地址 iSCSI&#xff08;Internet Small Computer System Interface&#xff09;是一種基于IP網絡的存儲協議&#xff0c;它能夠在TCP/IP網絡上實現SCSI協議&#xff0c;使得不同的主機可以通過網絡共享存儲設備。iSCSI可以將存儲設備映射到本地主機上&#xff0c;使得主…

ARTS 挑戰打卡的第7天 --- Ubuntu中的WindTerm如何設置成中文,并且關閉shell中Tab鍵聲音(Tips)

前言 &#xff08;1&#xff09;Windterm是一個非常優秀的終端神器。關于他的下載我就不多說了&#xff0c;網上很多。今天我就分享一個國內目前沒有找到的這方面的資料——Ubuntu中的WindTerm如何設置成中文&#xff0c;并且關閉shell中Tab鍵聲音。 將WindTerm設置成中文 &…

【Mac】mac 系統下格式化U盤或移動硬盤為ext4格式

1. 打開終端&#xff0c;安裝 homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"2. 安裝之后再次運行此命令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"…