【計算機網絡】HTTP與HTTPS

文章目錄

  • 1. HTTP定義
  • 2. HTTP交互
  • 3. HTTP報文格式
    • 3.1 抓包工具-fiddler
    • 3.2 抓包操作
    • 3.3 報文格式
      • 3.3.1 請求報文
      • 3.3.2 響應報文
  • 4. URL
  • 5. 請求頭中的方法
  • 6. GET和POST的區別
  • 7. HTTP報頭
    • 7.1 Host
    • 7.2 Content_Length
    • 7.3 Content_Type
    • 7.4 User-Agent(UA)
    • 7.5 Referer
    • 7.6 Cookie
  • 8 狀態碼
  • 9. 構造HTTP請求
    • 9.1 PostMan
    • 9.2 通過代碼
  • 10. HTTPS
    • 10.1 加密
    • 10.2 HTTPS工作流程
      • 對稱加密
      • 非對稱加密
      • 證書

1. HTTP定義

HTTP(超文本傳輸協議)是一種工作在應用層的協議,應用場景主要用于網站,即瀏覽器和服務器之間的數據傳輸,客戶端(手機、PC)和服務器之間的數據傳輸,也很可能是 HTTP。

超文本傳輸協議

文本:字符串(能在utf8/gbk碼表上找到合法字符)
超文本:不僅可以傳輸字符串,也可以傳輸圖片,特殊格式等,比如html
富文本:word文檔

HTTP版本

HTTP在3.0版本之前,都是基于TCP實現的,而在3.0版本之后是基于UDP實現的,提升了傳輸效率,安全性也提到了明顯的改善,當前使用廣泛的是HTTP1.1版本,是基于TCP實現的。

2. HTTP交互

HTTP的交互過程是典型的“一問一答”的形式。
在這里插入圖片描述
這種交互過程對于網站開發來說已經基本夠用,但是,有的網站會彈出廣告,點進去服務器會主動先發一條消息,像把QQ這樣的聊天窗口搬到網頁上來,對方發來消息我們這邊還有提示,這種情況HTTP的不能勝任。

上述場景是服務器主動給瀏覽器發消息,就稱為消息推送
應用層這里還提供了一個和 HTTP 搭配的協議,websocket (HTTP 的跟班,針對 HTTP 的能力進行補充的)

3. HTTP報文格式

3.1 抓包工具-fiddler

抓包工具,本質上是一個"代理程序",能夠獲取到網絡上傳輸的數據,并顯示出來,從而給程序員提供一些參考。

wireshark:高大全,可以抓各種協議數據包,TCP、IP、UDP、以太網…(使用起來更復雜一點)
fiddler:專注 HTTP 的抓包----https://www.telerik.com/download/fiddler

抓包工具其實就是一種"代理"程序,能夠獲取網絡上的數據并顯示出來給我們一些參考。
在這里插入圖片描述同時,代理分成兩種

1.正向代理(客戶端的代言人):比如我會求室友幫我帶一份飯,此時室友就是我的代理
2.反向代理(服務器的代言人):比如食堂大媽今天也不想動彈,此時會讓他的兒子來賣飯,此時他的兒子就是反向代理

翻墻效果:用來翻墻的代理,本質上是通過一個可以被訪問到的境外服務器部署代理服務器的。

3.2 抓包操作

在這里插入圖片描述
上面藍色的表示的是返回一個html,表示一個網站的入口請求。
查看明細:
在這里插入圖片描述通過使用該工具查看HTTP交互過程中的請求與交互的詳細信息。

3.3 報文格式

3.3.1 請求報文

HTTP請求的報文格式分為4個部分

1.首行------三部分用空格分開
GET https://www.csdn.net/ HTTP/1.1
GET:表示方法
https://www.csdn.net/:表示URL
HTTP/1.1:表示的是HTTP的版本號

2.請求頭(采用鍵值對的方式)------用空格/冒號分開在這里插入圖片描述

3.空行:請求頭結束會有一個空行,就是用來表示請求頭結束。

4.正文:body(也就是載荷),有的請求有載荷,有的則沒有。

3.3.2 響應報文

HTTP的響應報文格式也分為4個部分。

1.首行
在這里插入圖片描述
HTTP/1.1:表示的是HTTP的版本號
200:狀態碼
OK:狀態碼描述

2.響應頭(同樣也是鍵值對)

3.空行(標志著響應頭結束)

4.正文body(載荷部分)

4. URL

URL用來描述一個網絡資源的位置。
在這里插入圖片描述

http:// :協議,當前使用的是什么協議(HTTP/HTTPS…)
user:pass :登錄信息,并不常用,因為不安全
www.example.jp :IP地址,用域名訪問,通過地址知道服務器位置
80 :端口號,通過端口知道具體訪問服務器的哪個程序
dir/index.htm :路徑,通過路徑知道訪問的是哪個資源(此處可以是一個文件,也可以是一個虛擬文件)
uid=1 :查找字符串(quary string),針對請求做出的補充
ch1 :片段標識符,標識當前頁面的某個部分,通過不同的標識可以完成頁面的跳轉

URL encode

在quary string(查找字符串)中有很多程序員自定義的鍵值對
在URL中很多字符都有特殊的含義 : / # @等
如果quary string中也有相同的符號怎么辦,此時我們就需要轉義,當然對于漢字我們也需要轉義,通過ASCII進行對應轉義

5. 請求頭中的方法

在這里插入圖片描述
標準文檔的解釋

GET:從服務器獲取一個資源(讀操作)
POST:往服務器放一個東西(寫操作)

GET的使用場景

從服務器獲取一個數據,十分常見
在這里插入圖片描述

POST的使用場景

大部分用于上傳、登錄
在這里插入圖片描述
登錄操作使用的是POST方法,登錄的用戶名使用的是json數據格式組織登錄的,密碼并不是我們自己設置的密碼,而是進行了base64編碼(加密),將編碼傳輸到服務器。
密碼后面有 == 基本上就是base64編碼,Base64 是一種將二進制數據編碼為 ASCII 字符串的編碼方式,常用于在文本協議(如 HTTP、電子郵件)中安全傳輸二進制內容。

6. GET和POST的區別

GET和POST的區別(經典面試題)

本質上GET和POST沒有區別,使用GET的場景也能用POST,使用POST的場景也能使用GET。

但是在使用習慣上二者還是有區別的:
1.GET習慣把數據放到URL中,POST習慣把數據放到body(載荷)中。
同樣GET也可以把數據放到body中,但是有的瀏覽器會有限制;
POST也可以放到URL中,大多數是沒有限制。
2.語義上的區別,標準文檔中GET適用于讀取數據,POST用于傳輸數據。
3.關于冪等性,標準文檔中,建議GET是冪等的,POST無要求。(冪等就是一個輸入只對應一個輸出)
4.GET可以被瀏覽器收藏夾收藏,POST不可以。

一些關于GET和POST的解釋也不是很準確,大家理性看待

1.POST比GET更加安全
依據:GET傳輸的數據是放在URL中的,而POST存放的數據是放在body中的。
登錄場景中,如果密碼放到URL中可能會被看到,所以不安全,但是POST也是可以被心懷叵測的人抓包得到body。
辟謠:真正保證安全的,不是使用什么方法,而是對數據進行加密。

2.GET傳輸的數據量很小,POST傳輸的數據量很大。
以前確實是這樣的,但是現在標準文檔明確指出對GET的URL不做長度的限制。

3.GET只能攜帶文本數據,POST只能攜帶二進制數據。
這個說法不一定完全錯,URL是通過quary string來保存數據,quary string是只能包含文本數據的,但是urlencode可以對二進制文件進行編碼,自然也就成了文本了。
POST請求中也不是經常攜帶二進制數據,而是對二進制文件進行urlencode進行轉碼。

7. HTTP報頭

在這里插入圖片描述

7.1 Host

表示服務器主機的IP地址和端口號,這里的Host和URL中的IP地址、端囗絕大部分情況下都是一樣的.
在這里插入圖片描述

7.2 Content_Length

表示body(正文)中的數據長度,HTTP底層是基于TCP實現的,連續傳輸多個HTTP數據報,此時接收方這邊的接收緩沖區里就會積累多個包的數據,應用程序在讀取這些數據的時候就需要明確包之間的邊界,以防止出現“粘包問題”。

7.3 Content_Type

表示body(正文)中的數據格式,body可以傳輸很多種格式的,包括程序員也可以自己約定任意的格式。

請求中的格式

application/json --body就是json的數據格式
application/x-www-form-urlencode --稱為form表單,通過HTML中的form標簽構造出來的一種格式,特點就是把quary string放到body里。
multipart/form-data --上傳文件使用

響應中的格式

text/plain:純文本
text/html:返回HTML
text/css:返回css
application/Javascript:返回js
application/json:返回json
image/png:返回圖片
image/jpg:返回圖片

由于瀏覽器和服務器之間要進行多次網絡交互,整體的過程比較低效,為了提升效率,把一些固定不變的內容在瀏覽器本地的機器硬盤上進行緩存(css,圖片,js,很少發生改變的類型)。保存到硬盤上之后,后續再請求,就可以直接從硬盤上讀取數據,減少了網絡交互的開銷。

7.4 User-Agent(UA)

表示當前訪問的操作系統的信息以及瀏覽器信息。

UA在以前是常用的,由于用戶的設備存在差異,就可以通過UA區別設備,從而正確返回用戶想要的數據。
響應式布局(前端提出的解決上述問題的技術方案),通過一套代碼,適應不同尺寸的顯示器。也就是 CSS3 提供了一個特性,“媒體查詢”,可以感知到當前屏幕的尺寸,根據不同的尺寸,應用不同的樣式。

7.5 Referer

表示當前的頁面是由哪個頁面跳轉而來。

瀏覽器中,直接輸入url、點擊收藏夾打開的網頁,此時是沒有referer。
示例:廣告業務中,某廣告公司在不同的網站部署廣告,廣告公司有一臺服務器來計算來自不同網站的廣告的點擊量,如果知道該點擊來自哪個網站,就需要用到referer。

7.6 Cookie

Cookie就是持久化的保存一些信息,本質上是瀏覽器這邊本地持久化存儲數據的機制。

瀏覽器作為電腦上的一個程序,能否直接讀寫本地磁盤文件呢?

當然不可以,系統提供了API操作文件,作為一個程序當然可以調用這些API來操作了。理論上完全可行,但是瀏覽器禁止了這種做法,(瀏覽器并沒有給網頁提供這樣的API),一個網頁不能直接的讀寫硬盤文件。(為了信息安全以及硬盤安全)
瀏覽器選擇退而求其次,給網頁提供了這樣的 API,能夠有限度的存儲數據(按照鍵值對的格式),但不能隨意的訪問文件系統
瀏覽器提供的網頁可以存儲數據的機制:Cookie、LocalStorage、IndexDB

Cookie字段的使用

HTTP請求中的Cookie字段,就是把本地存儲的Cookie信息發送到服務器這邊; HTTP
響應中會有一個Set-Cookie字段,就是服務器告訴瀏覽器你要在本地保存哪些信息。

結論

Cookie 從哪里來?服務器返回給瀏覽器的,通常都是首次訪問/登錄成功之后。
Cookie 到哪里去?Cookie會存儲在瀏覽器本地主機的硬盤上,后續每次訪問服務器都會帶上Cookie。不同的客戶端,保存的Cookie是不同的,即使是同一個主機,使用不同瀏覽器,Cookie 大概率也不同。
Cookie 中存什么?鍵值對格式的數據,這里的內容都是程序員自定義的,和 query string 一樣外人無從理解。
cookie在瀏覽器這邊如何組織? 在硬盤本地保存,是按照不同的域名為維度分別存儲。
Cookie 的用途是什么?用來在客戶端保存數據,其中最主要的是保存用戶的身份標識,服務器就可以通過標識來區分用戶。

  • 個人感覺它的作用就是服務器讓客戶端在預定的位置本地存儲部分信息,每次客戶端訪問服務器,服務器會讀取一下在預定的位置本地存儲部分信息,從而區分不同客戶端

8 狀態碼

在這里插入圖片描述
在響應中,上述的200就是一個狀態碼,HTTP中的狀態碼都是約定好的。
在這里插入圖片描述

200 OK 表示一切順利
404 NOT FOUND 訪問的資源沒有找到
403 Forbidden 表示請求的資源沒有權限訪問
405 Method Not Allowed 服務器只支持GET,但是你發了個POST
500 Interal Server Error 服務器內部錯誤,可能是服務器掛了
504 Geteway Timeout 訪問服務器超時
302 Move temporarily 臨時重定向,如果一個網站更換了新的域名,但是老用戶并不知道,此時訪問原來的域名就可以跳轉到新的域名
301 永久重定向,瀏覽器會把重定向的結果記錄下來,后續再訪問就會直接訪問重定向的目標地址即可,不用跳轉

9. 構造HTTP請求

9.1 PostMan

PostMan是構造HTTP請求的第三方工具。
https://www.postman.com/web
在這里插入圖片描述

9.2 通過代碼

package network;import jdk.internal.util.xml.impl.Input;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class HttpClient {private Socket socket;private String ip;private int port;public HttpClient(String ip, int port) throws IOException {this.ip = ip;this.port = port;socket = new Socket(ip, port);}public String get(String url) throws IOException {StringBuilder request = new StringBuilder();//構造首行request.append("GET " + url + " HTTP/1.1\n");//構造headerrequest.append("Host: " + ip + ":" + port + "\n");//構造空行request.append("\n");//發送數據OutputStream outputStream = socket.getOutputStream();outputStream.write(request.toString().getBytes());//讀取響應數據InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024 * 1024];int n = inputStream.read(buffer);return new String(buffer, 0, n, "utf-8");}public String post(String url, String body) throws IOException {StringBuilder request = new StringBuilder();//構造首行request.append("POST " + url + " HTTP/1.1\n");//構造headerrequest.append("Host: " + ip + ":" + port + "\n");request.append("Conternt-Length: " + body.getBytes().length + "\n");request.append("Content-Type: text/plain\n");//構造空行request.append("\n");//構造 bodyrequest.append(body);//發送數據OutputStream outputStream = socket.getOutputStream();outputStream.write(request.toString().getBytes());//讀取響應數據InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024 * 1024];int n = inputStream.read(buffer);return new String(buffer, 0, n, "utf-8");}public static void main(String[] args) throws IOException {
//        HttpClient httpClient = new HttpClient("42.192.83.143", 8080);
//        String getResp = httpClient.get("/AjaxMockSever/info");
//        System.out.println(getResp);
//        String postResp = httpClient.post("/AjaxMockSever/info","this is body");
//        System.out.println(postResp);HttpClient httpClient = new HttpClient("www.sogou.com", 80);System.out.println(httpClient.get("http://www.sogou.com"));}
}

10. HTTPS

HTTPS是在HTTP的基礎上,引入了一個加密層(SSL)。

HTTP是明文傳輸的(不安全)
在這里插入圖片描述

10.1 加密

解決安全問題,最核心的要點,就是"加密"。

介紹密碼學中的概念

明文:真正要傳輸的數據
密文:針對明文進行了加密,得到的結果往往不直觀
明文變成密文==>就是加密
密文變成明文==>就是解密
加密和解密的過程中,涉及到一個關鍵道具,稱為“秘鑰”
對稱加密:加密和解密,使用的是同一個密鑰
非對稱加密:加密和解密,使用的是兩個密鑰。這兩個密鑰k1、k2,是成對的。可以使用k1來加密,此時就是k2解密;也可以使用k2加密,此時就是k1解密。
兩個密鑰,就可以一個公開出去,稱為"公鑰",另一個自己保存好,稱為"私鑰"。

10.2 HTTPS工作流程

引入加密,對HTTP傳輸的數據進行保護,主要針對 header 和 body 進行加密。

HTTPS = HTTP + SSL(加密層)

對稱加密

通過對稱加密的方式對傳輸的數據進行加密的操作。

1.對稱加密的時候,客戶端和服務器使用的是同一個密鑰
2.不同的客戶端要使用不同的密鑰(如果所有的客戶端密鑰都相同,加密形同虛設,黑客很容易拿到密鑰)

每個客戶端連接到服務器的時候,都需要自己生成一個隨機的密鑰,并且把這個密鑰告知服務器。密鑰需要傳輸給對方的,一旦黑客拿到了這個密鑰,意味著加密操作就無意義。
在這里插入圖片描述

非對稱加密

使用非對稱加密,主要是針對對稱密鑰加密,確保對稱密鑰的安全性。

非對稱加密系統開銷,遠遠大于對稱加密。不太適合使用非對稱加密針對大規模的數據進行加密。

服務器生成一對非對稱密鑰,私鑰服務器自己持有,公鑰則可以告知任何的客戶端。
客戶端在連上服務器之后,就需要先從服務器這邊拿到公鑰(公鑰本身就可以公開出去,不需要加密傳輸);然后客戶端生成對稱密鑰,拿著公鑰針對對稱密鑰進行加密。
此時就可以把加密之后的密文進行傳輸了,由于要想解密,必須通過私鑰,而私鑰只有服務器自己知道,此時這樣的加密的數據就可以比較安全的到達服務器了。
服務器通過私鑰解密之后得到了對稱密鑰,接下來和客戶端之間的通信就通過對稱加密來完成了。
在這里插入圖片描述
此時黑客拿到的是一個key加密后的結果,此時黑客要想解密,需要知道PRI,PRI私鑰只有服務器自己知道,黑客拿不到(黑客監聽中間的通信數據,要比黑入服務器這邊容易一些,如果都能黑進服務器了,大概率就可以直接拖數據庫了,用戶啥信息都被拿到了)。

SSL 內部完成的工作

使用HTTPS的時候,底層也是TCP先進行 TCP三次握手,TCP連接打通之后就要進行 SSL 的握手了(交換密鑰的過程),后面才是真正傳輸業務數據(完整的 HTTPS 的請求/響應了)。
在這里插入圖片描述
黑客自己也能生成一對公鑰和私鑰設,公鑰為 pub2,私鑰為 pri2。黑客不關心服務器的公鑰私鑰是啥,自己生成一對就行了。生成公鑰和私鑰的算法都是開放的,服務器能生成,黑客也能生成。
黑客就可以使用 pri2 對上述數據進行解密,因此黑客就拿到了 key 。黑客繼續使用從服務器拿到的 pub1 重新對 key 進行加密并且傳輸給服務器。

證書

如何解決上述問題?

最關鍵的一點,客戶端拿到公鑰的時候,要能有辦法驗證,這個公鑰是否是真的,而不是黑客偽造的。
要求服務器這邊要提供一個**“證書”**

證書是一個結構化的數據(里面包含很多屬性,最終以字符串的形式提供)
證書中會包含一系列的信息,比如服務器的主域名、公鑰、證書有效期…
證書是搭建服務器的人,要從第三方的公正機構進行申請的。
在這里插入圖片描述
一個關鍵問題:返回證書的時候,證書數據也是經過了黑客的設備,此時黑客是否能修改證書中的公鑰?公鑰替換成自己的公鑰呢?

不行,客戶端拿到證書之后,會先針對證書驗證真偽。

證書驗證的過程
證書中可能會包含這些信息

證書:服務器的域名:……
證書的有效時間:……
服務器的公鑰:……
公證機構信息:……
證書的簽名:……

其中最重要的就是證書的簽名。這個簽名并不是真正的簽名,而是根據算法將證書的數據算出他的校驗和,然后公證機構使用自己的私鑰(不是服務器的私鑰),針對校驗和進行加密,此時就得到了簽名。

客戶端拿到證書之后主要做兩件事:

1.按照同樣的校驗和算法將證書中的信息進行計算得到校驗和val1;
2.通過公證機構在系統中內置的公鑰來對證書進行解密,得到校驗和val2;
此時就對比看兩個校驗和是不是一致的

一致就是沒被修改過的
不一致就是被修改過的,如果黑客替換成了自己的公鑰,此時客戶端通過計算就會發現數據錯誤,此時客戶端就能發現錯誤。
這時候瀏覽器就會彈出一個告警界面,告訴用戶你訪問的網站有風險。

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

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

相關文章

怎樣提升大語言模型(LLM)回答準確率

怎樣提升大語言模型(LLM)回答準確率 目錄 怎樣提升大語言模型(LLM)回答準確率激勵與規范類知識關聯類情感與語境類逆向思維類:為什么不,反面案例群體智慧類明確指令類示例引導類思維引導類約束限制類反饋交互類:對話激勵與規范類 給予獎勵暗示:在提示詞中暗示模型如果回…

【分享】內外網文件擺渡系統:讓數據傳輸更安全更可靠

【分享】Ftrans內外網文件擺渡系統:讓數據傳輸更安全更可靠! 隨著大數據時代的到來,數據的重要性日漸得到重視,數據作為數字經濟時代下的基礎性資源和戰略性資源,是決定國家經濟發展水平和競爭力的核心驅動力。以行業…

Python自動化面試通關秘籍

Python自動化測試工程師面試,不僅僅是考察你的代碼能力,更看重你如何在項目中靈活運用工具和框架解決實際問題。如果你正準備面試,這篇文章將為你總結最常見的高頻考題及答題技巧,幫助你快速上手,通關面試,…

Logstash開啟定時任務增量同步mysql數據到es的時區問題

本文使用修改時間modify_date作為增量同步檢測字段,可檢測新增和修改,檢測不到刪除,檢測刪除請使用canal查詢binlog日志同步數據 檢測修改時間字段為varchar的時候可以先創建索引,并設置對應的mapping為(可以無視時區…

如何使用 FastAPI 構建 MCP 服務器

哎呀,各位算法界的小伙伴們!今天咱們要聊聊一個超酷的話題——MCP 協議!你可能已經聽說了,Anthropic 推出了這個新玩意兒,目的是讓 AI 代理和你的應用程序之間的對話變得更順暢、更清晰。不過別擔心,為你的…

【Git】-- 處理 Git 提交到錯誤分支的問題

如果你不小心把本應提交到 test 分支的代碼提交到了 master 分支(但尚未 push),可以按照以下步驟解決: 方法一(推薦):使用 git reset 和 git stash 首先,確保你在 master 分支&…

通用目標檢測技術選型分析報告--截止2025年4月

前言 本文撰寫了一份關于通用目標檢測(General Object Detection)的技術選型分析報告,覆蓋2000至2025年技術演進歷程,重點納入YOLO-World、RT-DETR、Grounding DINO等2024-2025年的最新模型。 報告將包括技術定義、行業現狀、技…

鏈路追蹤Skywalking

一、什么是Skywalking 分布式鏈路追蹤的一種方式:Spring Cloud SleuthZipKin,這種方案目前也是有很多企業在用,但是作為程序員要的追逐一些新奇的技術,Skywalking作為后起之秀也是值得大家去學習的。 Skywalking是一個優秀的國產…

websocket獲取客服端真實ip

在websocket建立連接時,獲取訪問客戶端的真實ip 1. websocket建立連接過程 2. pom依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>3. 添加配置,握…

NSSCTF(MISC)—[justCTF 2020]pdf

相應的做題地址&#xff1a;https://www.nssctf.cn/problem/920 binwalk分離 解壓文件2AE59A.zip mutool 得到一張圖片 B5F31內容 B5FFD內容 轉換成圖片 justCTF{BytesAreNotRealWakeUpSheeple}

部分國產服務器CPU及內存性能測試情況

近日對部分國產服務器進行了CPU和內存的性能測試&#xff0c; 服務器包括華錕振宇、新華三和中興三家&#xff0c;CPU包括鯤鵬、海光和Intel&#xff0c;初步測試結果如下&#xff1a; 服務器廠商四川華錕振宇新華三中興中興服務器HuaKun TG225 B1R4930 G5R5930 G2R5300 G4操作…

【無標題】Scala函數基礎

函數和方法的區別 1&#xff09; 核心概念 &#xff08;1&#xff09; 為完成某一功能的程序語句的集合&#xff0c;稱為函數。 &#xff08;2&#xff09; 類中的函數稱之方法。 2&#xff09; 案例實操 &#xff08;1&#xff09; Scala 語言可以在任何的語法結構中聲明…

uniapp -- 列表垂直方向拖拽drag組件

背景 需要在小程序中實現拖拽排序功能,所以就用到了m-drag拖拽組件,在開發的過程中,發現該組件在特殊的場景下會有些問題,并對其進行了拓展。 效果 組件代碼 <template><!-- 創建一個垂直滾動視圖,類名為m-drag --><scroll

conda安裝python 遇到 pip is configured with locations that require TLS/SSL問題本質解決方案

以前寫了一篇文章&#xff0c;不過不是專門為了解決這個問題的&#xff0c;但是不能訪問pip install 不能安裝來自https 協議的包問題幾乎每次都出現&#xff0c;之前解決方案只是治標不治本 https://blog.csdn.net/wangsenling/article/details/130194456???????https…

【初階數據結構】隊列

文章目錄 目錄 一、概念與結構 二、隊列的實現 隊列的定義 1.初始化 2.入隊列 3.判斷隊列是否為空 4.出隊列 5.取隊頭數據 6.取隊尾數據 7.隊列有效個數 8.銷毀隊列 三.完整源碼 總結 一、概念與結構 概念&#xff1a;只允許在一端進行插入數據操作&#xff0c;在另一端進行刪除…

Apache Shiro 全面指南:從入門到高級應用

一、Shiro 概述與核心架構 1.1 什么是 Shiro&#xff1f; Apache Shiro 是一個強大且易用的 Java 安全框架&#xff0c;它提供了認證&#xff08;Authentication&#xff09;、授權&#xff08;Authorization&#xff09;、加密&#xff08;Cryptography&#xff09;和會話管…

es 3期 第28節-深入掌握集群組建與集群設置

#### 1.Elasticsearch是數據庫&#xff0c;不是普通的Java應用程序&#xff0c;傳統數據庫需要的硬件資源同樣需要&#xff0c;提升性能最有效的就是升級硬件。 #### 2.Elasticsearch是文檔型數據庫&#xff0c;不是關系型數據庫&#xff0c;不具備嚴格的ACID事務特性&#xff…

Android學習總結之通信篇

一、Binder跨進程通信的底層實現細節&#xff08;掛科率35%&#xff09; 高頻問題&#xff1a;“Binder如何實現一次跨進程方法調用&#xff1f;”   候選人常見錯誤&#xff1a;   僅回答“通過Binder驅動傳輸數據”&#xff0c;缺乏對內存映射和線程調度的描述混淆Binde…

數據結構C語言練習(兩個棧實現隊列)

一、引言 在數據結構的學習中&#xff0c;我們經常會遇到一些有趣的問題&#xff0c;比如如何用一種數據結構去實現另一種數據結構的功能。本文將深入探討 “用棧實現隊列” 這一經典問題&#xff0c;詳細解析解題思路、代碼實現以及每個函數的作用&#xff0c;幫助讀者更好地…

前端如何導入谷歌字體庫

#谷歌字體庫內容豐富&#xff0c;涵蓋上千種多語言支持的字體&#xff0c;學習導入谷歌字體庫來增加網站的閱讀性&#xff0c;是必不可少的一項技能# 1&#xff0c;前往谷歌字體網站 要會魔法&#xff0c;裸連很卡 2&#xff0c; 尋找心儀字體 Googles Fonts下面的filters可…