【Linux篇章】互聯網身份密碼:解密 Session 與 Cookie 的隱藏玩法和致命漏洞!

本篇摘要

  • 本篇將承接上篇HTTP講解( 戳我查看 )遺留的關于Cookie與Session的介紹,在本篇,將會介紹Cookie的由來,作用,以及缺點等,進而引出Session,最后介紹一下它們的性質等,以接我們上文模擬實現的http服務器加上這兩個功能做測試,來驗證上述的成立性!
    在這里插入圖片描述
    在這里插入圖片描述

歡迎拜訪:點擊進入博主主頁
本篇主題:解密Cookie與Session的不解之緣!
制作日期: 2025.08.04
隸屬專欄:點擊進入所屬Linux專欄

一· Cookie 介紹

什么是 Cookie?

  • HTTP Cookie(也稱為 Web Cookie、 瀏覽器 Cookie 或簡稱 Cookie) 是服務器發送到用戶瀏覽器并保存在瀏覽器上的一小塊數據, 它會在瀏覽器之后向同一服務器再次發起請求時被攜帶并發送到服務器上。 通常, 它用于告知服務端兩個請求是否來自同一瀏覽器, 如保持用戶的登錄狀態、 記錄用戶偏好等!
  • 簡單來說,就是記錄用戶的一個標記,便于服務器識別用戶!

Cookie 的原理

  • 當用戶第一次訪問網站時, 服務器會在響應的 HTTP 頭中設置 Set-Cookie字段, 用于發送 Cookie 到用戶的瀏覽器。
  • 瀏覽器在接收到 Cookie 后, 會將其保存在本地(通常是按照域名進行存儲) 。
  • 在之后的請求中, 瀏覽器會自動在 HTTP 請求頭中攜帶 Cookie 字段, 將之前保存的 Cookie 信息發送給服務器

Cookie 的用途

  • 用戶認證和會話管理(常用)。
  • 跟蹤用戶行為。
  • 緩存用戶偏好等。

單Cookie行為舉例

下面我們就拿單Cookie的用戶認證舉個例子(因為會話管理等是結合Session的后續講):

比如我們登錄的時候,由于http無狀態,就需要它來記錄用戶登錄時候的賬號密碼等,當用戶第一次成功登錄,就把它記錄下來發給瀏覽器,然后我們關斷這個網頁,下次再去訪問甚至很久或者關了瀏覽器在一段時間內都是可以進行直接登錄的(這就利用了Cookie機制,之后每次我們登錄,瀏覽器都會自動把對應域名下的Cookie攜帶上,但是這樣是有風險的,我們后面談到,因此需要結合Session一起用)。

Cookie 存儲分類

  • 會話 Cookie( Session Cookie): 在瀏覽器關閉時失效。
  • 持久 Cookie( Persistent Cookie): 帶有明確的過期日期或持續時間,可以跨多個瀏覽器會話存在。

因此可以認為儲存的Cookie分為內存級別文件級別,就是對應上面的兩種分類,內存中是見不到的,但是文件方式以二進制或 sqlite 格式存儲,一般我們查看, 直接在瀏覽器對應的選項中直接查看即可。

比如這種查看文件格式

在這里插入圖片描述

Cookie 應用的格式

首先,我們要知道Cookie是在瀏覽器和服務器之間交互的一個標記。

  • HTTP 存在一個報頭選項Set-Cookie, 可以用來進行給瀏覽器設置 Cookie值。
  • 在 HTTP 響應頭中添加, 客戶端(如瀏覽器) 獲取并自行設置并保存Cookie。

具體用法

set-cookie: username=111; expires=sat,03 May 2025 10:34:45 UTC; path=/;

看一下例子

服務端先Set-Cookie

在這里插入圖片描述

客戶端再發送回來

在這里插入圖片描述

下面我們就以這個例子,說一下下面Cookie的填充部分,我們就以Cookie對應的名稱expires,還有path講解:

  • 對于服務端,需要建立Cookie也就是Set-Cookie,那么它后面跟的第一個名稱就是將來瀏覽器要發送給服務器的(假設我們要進行登錄驗證,那么第一個值就可以設置成對應的關鍵詞比如登錄,密碼等)。

  • 由于下面我們測試的是文件級別的Cookie,因此給它設置上過期時間(expires),這個時間格式就是我們上面例子那樣,這里我們采取的是UTC也就是協調世界時(UTC 是現在用的時間標準, 多數全球性的網絡和軟件系統將其作為標準時間),當然也可以是GMT(格林尼治標準時間),感興趣的可以去了解下,這里不是重點,這里如果設置了expires那么就文件級別等到到時間就過期自動清除,否則就是內存級別,瀏覽器關閉自動清除

  • 對于path,其實就是對應的路徑,也就是指定的path后,只有我們訪問對應的瀏覽器下Cookie保存的路徑時,瀏覽器才會發送這個Cookie,比如保存的是/ 那么始終都會發送,但是如果是/a/b,那么只有訪問這個路徑才會發送,后面我們驗證下!

  • 這里我們服務端只需要按照指定格式給瀏覽器發生即可,然后瀏覽器就會按照一定規則儲存起來,需要的時候在按照一定格式發回來,這樣完成交互(這里他倆的解析方式我們不用管)!

如果有需要了解其他的拓展部分,可參考這張表

屬性描述
usernamepeter這是 Cookie 的名稱和值,標識用戶名為 “peter”。
expiresThu, 18 Dec 2024 12:00:00 UTC指定 Cookie 的過期時間。在這個例子中,Cookie 將在 2024 年 12 月 18 日 12:00:00 UTC 后過期。
path/定義 Cookie 的作用范圍。這里設置為根路徑 /,意味著 Cookie 對.example.com 域名下的所有路徑都可用。
domain.example.com指定哪些域名可以接收這個 Cookie。點前綴(.)表示包括所有子域名。
secure-指示 Cookie 只能通過 HTTPS 協議發送,不能通過 HTTP 協議發送,增加安全性。
HttpOnly-阻止客戶端腳本(如 JavaScript)訪問此 Cookie,有助于防止跨站腳本攻擊(XSS)。

注意事項:

  • 每個 Cookie 屬性都以分號 (;) 和空格( ) 分隔。

  • 名稱和值之間使用等號(=) 分隔。

  • 如果 Cookie 的名稱或值包含特殊字符(如空格、 分號、 逗號等) , 則要進行 URL 編碼(比如名稱如果包含了就需要自主進行編碼,否則發給瀏覽器識別不了就不會儲存這個Cookie,這也就要求雙方自主編碼處理了,這里一般還是服務器要注意,因為是它構建Cookie)。

  • 這里我們比如拿登錄為例子,此時我們不能一個Set-Cookie后面跟賬號密碼就完了,因為瀏覽器會拿Cookie的第一個名稱作為自己本地保存的名稱,因此我們需要給它發兩個Cookie:一個username,一個password,這樣它就會呈現兩個Cookie保存,發過來的時候合并成一個Cookie(如下圖所示)就是上面我們看到的那樣(就把它當做規則記住)!

在這里插入圖片描述

Cookie安全性

  • 使用 secure 標志可以確保 Cookie 僅在 HTTPS 連接上發送, 從而提高安全性。

  • 使用 HttpOnly 標志可以防止客戶端腳本(如 JavaScript) 訪問 Cookie,從而防止 XSS 攻擊。

  • 通過合理設置 Set-Cookie 的格式和屬性, 可以確保 Cookie 的安全性、 有效性和可訪問性, 從而滿足 Web 應用程序的需求。

以上了解即可!

單獨使用Cookie的風險

有利就有弊:

比如我們登錄賬號的時候,返回來的Cookie就是賬號與密碼然后進行保存,那么此時如果瀏覽器被黑客監控,此時賬號就相當于被盜了,信息就都泄露了!!!

  • 由于 Cookie 是存儲在客戶端的, 因此存在被篡改或竊取的風險。

那么如何避免呢,也就是后續我們引入的Session了,它雖然避免了盜號的風險,但是也是會泄露個人數據信息等

基于模擬實現HTTP服務器測試 Cookie

下面我們還是基于我們之前寫的http服務器的代碼進行改造,給它加上請求報頭返回Cookie的功能即可,先說下思路:

首先,我們密碼設置的是666,也就是只要用戶輸入的密碼是666,無論用戶名是什么,此時第一次輸入正確密碼,就建立Cookie然后給客戶端發送作為Cookie保存,當后面無論輸入什么或者不輸入都能登錄進來,然后我們給它加了個截止日期,也就是到時間Cookie自動清除,還有指定路徑等!

大致分成以下幾步:

  • 構建Cookie: 此時我們按照一定的格式把對應的名稱,expirespath給它添加進去。
// 獲得時間:string get_mon(int month){vector<string> months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };return months[month];}string get_week(int day){vector<string> weekdays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };return weekdays[day];}string expires_time(int te){time_t curtime = time(nullptr) + te;struct tm* pm = gmtime(&curtime); // 可以認為傳遞指針為了防止拷貝,返回指針可以認為是便于指針訪問char buff[1024];snprintf(buff, sizeof(buff), "%s, %02d %s %d %02d:%02d:%02d UTC", get_week(pm->tm_wday).c_str(),pm->tm_mday,get_mon(pm->tm_mon).c_str(),pm->tm_year + 1900,pm->tm_hour,pm->tm_min,pm->tm_sec);return buff;}void set_cookie_username(string username){string cookie;cookie = "Set-Cookie: username=" + username + "; expires=" + expires_time(300) + "; path=/;";_cookies.emplace_back(cookie);}void set_cookie_password(string password){string cookie;cookie = "Set-Cookie: password=" + password + "; expires=" + expires_time(300) + "; path=/;";_cookies.emplace_back(cookie);}
  • login界面的時候進行提取對應的請求報頭中Cookie的password信息進行保存,后面無論是get還是post方法拿到的都是一樣的,下面我們就判斷拿到的Cookie信息是否為666即可,如果是的話就直接給它返回對應登錄成功界面,否則:那么password是否是666,如果是就構建Cookie返回,否則進行報錯處理!
  1·驗證cookie是否存在:if (re.get_password() == "666"){ // 存在直接讓它訪問(無需驗證密碼)res.set_route("./wwwroot/video.html");goto again;}if (pw == "666"){ // 密碼正確,cookie不存在,第一次添加cookie:res.set_cookie_username(username);res.set_cookie_password(pw);res.set_route("./wwwroot/video.html");}else{res.set_route("./wwwroot/404.html");}

整體邏輯就這樣,下面我們測試下:

驗證Cookie可以成功交互

  • 首先第一次請求登錄輸入正確密碼:

在這里插入圖片描述

  • 服務器識別到密碼正確給瀏覽器發對應的Cookie:

在這里插入圖片描述

  • 查看瀏覽器收到的對應的Cookie:

在這里插入圖片描述

  • 下面我們嘗試錯誤密碼輸入:

在這里插入圖片描述

  • 也是可以成功登錄:

在這里插入圖片描述

  • 這里無密碼也是可以成功登錄的:

在這里插入圖片描述

  • 下面我們已經保存了正確的Cookie,上面是get請求,下面我們驗證下post請求:

在這里插入圖片描述
在這里插入圖片描述

也是成立的!

驗證Cookie過期

  • 因為我們設置的5min后過期,現在已經過期了:

在這里插入圖片描述

  • 找不到,被返回了404界面:

在這里插入圖片描述

  • Cookie被清空:

在這里插入圖片描述

驗證 path 路徑

  • 我們給對應的構建Cookie的時候修改路徑:

在這里插入圖片描述

  • 接著還是老樣子訪問發現進不去了:

在這里插入圖片描述

驗證Cookie結束

  • 對于代碼 :我們從請求中提取Cookie的更改在deserialize函數里面;然后對Cookie是如何構建的,這兩部分都在http.hpp文件
    里;其次就是處理時候是利用回調函數完成的在main.cc文件
    里;其他部分未做修改后續源碼處自提!

二· Session 介紹

上面講到了,單純的Cookie是不安全的,下面就需要Cookie與Session達成的會話一起來維護,而session只不過是一種形式,還是以Cookie為載體的,因此用法還走的Cookie那套,下面我們就介紹下Session

什么是 Session

  • HTTP Session 是服務器用來跟蹤用戶與服務器交互期間用戶狀態的機制。

  • 由于 HTTP協議是無狀態的(每個請求都是獨立的),因此服務器需要通過Session 來記住用戶的信息。

Session 的原理

  • 當用戶首次訪問網站時, 服務器會為用戶創建一個唯一的 Session ID, 并通過Cookie 將其發送到客戶端

  • 客戶端在之后的請求中會攜帶這個 Session ID, 服務器通過 Session ID 來識別用戶, 從而獲取用戶的會話信息

  • 對服務器而言,服務器通常會將 Session 信息存儲在內存、 數據庫或緩存中

總之Session也是走的Cookie那一套,然后比Cookie更加加密一下,對應的Cookie信息不會直接暴露,但是可以客戶端可以拿著它訪問一定的曾經記錄的資源,并不會像之前那樣因為賬號密碼等直接暴露導致的重大問題發生!

Session 特性及用途

特性

Session 可以設置超時時間, 當超過這個時間后, Session 會自動失效(類似Cookie的expires設置,或者服務端自己記錄超時時間),服務器也可以主動使 Session 失效, 例如當用戶退出時(服務端識別后去更改對應的Session信息,當被標記后,再次請求,服務端就去檢查Session發現狀態不對就讓它過期)!

用途

  • 用戶認證和會話管理(重點)
  • 存儲用戶的臨時數據(如購物車內容)
  • 實現分布式系統的會話共享(通過將會話數據存儲在共享數據庫或緩存中)

Cookie+Session機制舉例

下面我們就拿購物車內容作為session工作的例子:

  • 比如用戶訪問一個服務器,然后登錄上,此時服務器機會創建對應唯一的session-id來標識對應資源,然后作為Cookie返回給瀏覽器;接下來用戶在進行購物車添加的時候,對應的維護在服務端的session-id對應資源也在變化(由服務器維護

  • 如果此時用戶退出來,然后再登陸,就會給對應服務器發送那個session-id,然后服務器拿到后識別到已經登錄確定好身份,然后用戶去訪問不同頁面,此時服務器就先去看session-id資源里面保存的情況然后呈現出來。

  • 如果黑客拿到對應session-id去訪問,此時服務器也會把它當成真正用戶處理,和上面過程一樣,訪問暢通無阻,只不多session都會設置過期,這就某種程度限制了黑客行為,但是也是不安全的

Session 安全性

  • Cookie 相似, 由于 Session ID 是在客戶端和服務器之間傳遞的, 因此也存在被竊取的風險,但是一般雖然 Cookie 被盜取了, 但是用戶只泄漏了一個 Session ID(以及和它相關的記錄), 私密信息暫時沒有全部被泄露的風險(比如密碼等,而且session一般會過期,如果是單Cookie的話就是永久泄露,但是session就是暫時了)。

  • Session ID 便于服務端進行客戶端有效性的管理, 比如異地登錄。

通俗易懂解釋:

也就是如果用的是session,被泄露后,比如:黑客拿到對應的session,它就能夠直接訪問到用戶的資源,也就是被黑客盜取session后,服務端就把黑客當成原用戶對待了(只不過黑客拿不到密碼,而且session只是暫時有效),這樣避免了上面的問題,但是還是有漏洞,因此還是需要解決方案來防范的

安全解決方法:

  • 可以通過 HTTPS 和設置合適的 Cookie 屬性(如 HttpOnlySecure) 來增強安全性。

更詳細版:

  • 使用HTTPS防止中間人攻擊來竊聽session ID

  • 設置HttpOnlySecure標志來保護cookie,防止通過JavaScript訪問和確保只通過HTTPS傳輸。

  • 實施session過期機制,減少session ID被盜用的風險。

  • 采用更復雜的token機制(如OAuth2.0)代替簡單的session ID。

  • 對敏感操作實施額外驗證步驟,如二次確認、短信驗證碼等。

基于模擬實現HTTP服務器測試 Session

下面我們驗證一下關于Session的正確使用以及過期是如何處理的:

先說下流程:

首先第一次發送正確密碼666.然后被服務端識別到是第一次,然后構建對應的唯一的session并且和資源綁定,然后作為Cookie發給瀏覽器,瀏覽器拿到后進行保存,當第二次,只要訪問同一個服務端就會發送這個session,此時就隨意登錄了。

代碼實現大致可以分成以下幾步:

  • 先確定好對應Session-id對應資源映射關系,這里我們把對應屬性,狀態,資源封裝成一個類,利用哈希完成映射即可,其次就是因為我們用的處理函數是回調,跑到main里面執行,因此為了避免回調傳參,我們把管理資源的類也就是這個哈希表初始化在全局
#pragma once
#include <iostream>
#include <string>
#include <memory>
#include <ctime>
#include <unistd.h>
#include <unordered_map>
using namespace std;
class session
{public:session(const string& username, const string& status): _username(username), _status(status){_create_time = time(nullptr);_terminatal_time = _create_time + 300; // 默認300秒后過期}~session(){}string _username;string _status;uint64_t _create_time;uint64_t _terminatal_time;// 用戶其他狀態可以后續添加
};using session_ptr = shared_ptr<session>;class session_manager
{public:session_manager(){srand(time(nullptr) ^ getpid());}string add_session(session_ptr  s){// 保證sessionid為正數uint32_t randomid = rand() + time(nullptr); // 隨機數+時間戳,實際有形成sessionid的庫,比如boost uuid庫,或者其他第三方庫等string sessionid = std::to_string(randomid);_sessions.insert(std::make_pair(sessionid, s));return sessionid;}session_ptr get_session(string sessionid){if (_sessions.find(sessionid) == _sessions.end()){return nullptr;}return _sessions[sessionid];}~session_manager() {}private:unordered_map<string, session_ptr> _sessions;
};
  • 解析請求的時候利用和上面Cookie一樣的機制,其次就是建立Cookie變一下,這里雖然我們不寫截止日期,可以在服務端內部session管理的資源內設置
 void set_cookie_session(string session_id) {string cookie;cookie = "Set-Cookie: sessionid=" + session_id + ";";_cookies.emplace_back(cookie);}
  • 下面就是如何響應這個session,第一次先檢查有沒有session被檢測出來,如果有那么就找到它的資源看是否為空有可能瀏覽器保存了,但是服務端重啟了,導致服務端數據沒了)其次就是檢查下對應的session資源里有沒有超時標記,都沒有的話就直接把資源給它即讓它登錄;否則再看密碼是否666,是的話就建立session作為Cookie寫回去,反之就報錯!
 // 2·驗證session是否存在(也就是cookie——session共同使用):if (!re.get_password().empty()){// 非第一次套用session:session_ptr sn = ursm->get_session(re.get_password());// cookie沒有過期if (sn && sn->_terminatal_time > time(nullptr)){use_log(loglevel::DEBUG) << sn->_username << " --- " << sn->_status;res.set_route("./wwwroot/video.html");goto again;}else{ // 可能服務器程序關閉了,此時瀏覽器還保存了對應的之前的cookie-sessionid,這樣下次如果服務器訪問就會找不到:use_log(loglevel::DEBUG) << "用戶的cookie已經過期, 需要清理!";res.set_route("./wwwroot/404.html");}}else{// 第一次建立session:if (pw == "666"){string user = "user-" + std::to_string(number++);session_ptr sn = make_shared<session>(user, "login");string sessionid = ursm->add_session(sn);res.set_cookie_session(sessionid);use_log(loglevel::DEBUG) << sn->_username << " 的cookie-session成功被添加,id是:" << sessionid;res.set_route("./wwwroot/video.html");}else{res.set_route("./wwwroot/404.html");}}again: 1;

驗證Session環節:

  • 老樣子還是以正確密碼登錄:

在這里插入圖片描述

  • 然后我們會發現服務器給瀏覽器寫回一個Cookie:

在這里插入圖片描述

  • 這個Cookie就綁定了一些狀態,資源等,下面我們隨機密碼訪問:

在這里插入圖片描述

  • 也是成功返回理想界面:

在這里插入圖片描述

  • 因為這里我們Session設置額是有截止日期,五分鐘后過期:

在這里插入圖片描述

  • 因此如果過期后我們在進行訪問:

在這里插入圖片描述

  • 就會放回404頁面:

在這里插入圖片描述

  • 服務器這邊日志也顯示過期了:

在這里插入圖片描述

驗證Session結束!

  • 對于代碼: Session-id對于資源等放在session.hpp文件中,然后就是在tcpserver.hpp處理任務改成單進程就可以驗證對應session功能,剩下的改動就是對應的main.cc中對session的處理邏輯,以及http.hpp中構建session-cookie邏輯了!

關于測試Session時出現的bug總結

  • BUG-1

  • 就是因為我們自己服務器就是個程序,測試的時候肯定會關閉重啟之類的,因此之前儲存的session-id對應資源也會丟失,如果之前被瀏覽器保存了對應的session但是服務器自己重啟了,然后瀏覽器即便發回來正確session-id無法被服務器識別這里我們就認為是過期了,需要清理),因此服務器處理session-id的時候判斷一下即可!

  • BUG-2

  • 也是一直困擾了博主半天的bug,當時由于沒看底層tcp是如何實現的,導致了一直就是一開始成功發送session,而且瀏覽器也發給服務器了,但是服務器卻查找資源沒找到找了幾個小時,把那些頭文件都看了個遍,最后仔細看tcp實現,發現是多進程實現的,而且每次都是派出孫子進程去執行執行的,那么這樣就寫實拷貝,因此每次看到的session由于哈希映射的資源都會被清空(即使服務器不重啟)。

解決方案1:

  • 只為了追求出測試效果,可以考慮單進程,但是這樣就會出現服務器壓力過大,反應慢,甚至加載不出來等(比如加載一個動圖需要服務器那邊的進程一直執行,而當用戶在瀏覽器繼續點擊的時候又會發送請求,此時服務器就無法應答,一直卡著)當然實際這種方法是絕對不可行的,這里我們使用的單進程這種!

解決方案2:

  • 可以考慮多線程或者線程池去實現http這塊請求處理與答復

三·基于CookieSession的總結

  • 這里我們只需要記住單純Cookie機制不結合Session來完成對http無狀態的記錄是十分不安全的,因此需要sessioncookie共同完成會話的記錄,但是這樣也不是絕對安全的,因此在此基礎上又會加上一些安全措施來保證用戶安全上網

  • 因此,記住, Cookie通過記錄某些信息來使得服務端由狀態性Session是在Cookie基礎上一種相對保密的措施,以id映射對應用戶曾經訪問資源,狀態的一種手段,但都是不安全的,還需要另加保護防范!

四· 源碼匯總

在這里插入圖片描述

點擊這里跳轉my-gitee查看測試源代碼

五· 本篇小結

  • 在本篇中深入學習了Session原理,用法,不足等等,Cookie和此外還進行了基于自己實現的HTTP服務器模擬測試這些功能,在書寫代碼的過程中同樣遇到了好多bug也浪費了很多時間,上面也總結了,因此之后在學習的時候一定要把整個代碼運行過程的輪廓(包括上層和底層都考慮清楚拒絕類似bug再次發生,向下一次的網絡學習進擊!

  • 太年輕的人,他總是不滿足!

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

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

相關文章

Postman接口測試工具:高效管理測試用例與環境變量,支持斷言驗證及團隊協作同步

之前跟你們聊過能搭知識網絡的 Obsidian&#xff0c;今天換個偏向接口測試的方向 —— 給你們安利一個 Github 上的「Postman」&#xff0c;它是個接口測試工具&#xff0c;官網能直接下載&#xff08;Postman: The Worlds Leading API Platform | Sign Up for Free&#xff09…

可可圖片編輯 HarmonyOS 上架應用分享

可可圖片編輯 HarmonyOS 上架應用分享 介紹 可可圖片編輯 原名 圖片編輯大師&#xff0c;因為上架審核的時候 &#xff0c;提示與一些已有應用重名&#xff0c;為了避免沖突&#xff0c;需要改名字&#xff0c;所以苦心思考了一分鐘&#xff0c;就調整成 可可圖片編輯。 應用…

Notepad++近期版本避雷

近期Notepad若干版本存在投毒事件&#xff0c;雖然也歡迎大家使用替代軟件&#xff0c;但是Notepad作為一款開源軟件&#xff0c;如有需要也可以繼續白嫖使用&#xff0c;但是請務必避開若干埋雷版本&#xff01; 經檢查&#xff0c;部分版本在幫助菜單中加入了有關tw的部分個人…

【lucene核心】impacts的由來

在 Lucene 的 Impact 概念&#xff08;出現在 ImpactsEnum / Impact 對象里&#xff09;中&#xff1a;字段 含義 freq 當前 term 在該文檔中出現了多少次&#xff08;即詞頻 term frequency&#xff09;。 norm 當前 文檔在該字段中的長度因子&#xff08;即之前 norms 里保存…

基于Echarts+HTML5可視化數據大屏展示-惠民服務平臺

效果展示代碼結構&#xff1a;主要代碼實現 index.html布局 <!doctype html> <html><head><meta charset"utf-8"><title>雙數智慧公衛-傳染病督導平臺</title><meta http-equiv"refresh" content"60;urlhttps…

【Flink】DataStream API:執行環境、執行模式、觸發程序執行

目錄執行環境getExecutionEnvironmentcreateLocalEnvironmentcreateRemoteEnvironment執行模式流執行模式&#xff08;Streaming&#xff09;批執行模式&#xff08;Batch&#xff09;自動模式&#xff08;AutoMatic&#xff09;觸發程序執行DataStream API是Flink的核心層API&…

CentOS7.6

騰訊云服務器 騰訊云 產業智變云啟未來 - 騰訊 服務器在控制臺顯示 點擊進入面板&#xff0c;顯示所有信息 現在來安裝桌面的遠程控制軟件 寶塔SSH終端:一款同時支持SSH和SFTP客戶端的免費軟件! 點擊立即下載 在云服務器的實例列表復制公網ip 密碼就是服務器的密碼&#xff…

前端架構知識體系:常見圖片格式詳解與最佳實踐

前端開發必備&#xff1a; 在前端開發中&#xff0c;合理選擇圖片格式直接影響網頁加載性能、用戶體驗和帶寬成本。本文將系統梳理常見圖片格式&#xff0c;分析它們的優缺點、壓縮原理、兼容性和推薦使用場景&#xff0c;并提供前端優化實戰建議。1. JPEG / JPG 全稱&#xff…

ARM的編程模型

ARM的編程模型 ARM 的編程模型指的是從程序員&#xff08;特別是匯編程序員和編譯器設計者&#xff09;視角所看到的 ARM 處理器架構。它定義了程序員可以使用的資源、數據操作方式以及規則&#xff0c;主要包括&#xff1a;寄存器組、數據類型、內存訪問方式、執行狀態和異常處…

最大熵強化學習相比傳統強化學習,有什么缺點?

要理解最大熵強化學習&#xff08;MaxEnt RL&#xff09;相比傳統強化學習&#xff08;如DQN、PPO、DDPG等&#xff09;的缺點&#xff0c;首先需要明確兩者的核心差異&#xff1a;傳統RL的目標是“最大化累積獎勵”&#xff0c;而MaxEnt RL在該目標基礎上額外增加了“最大化策…

python生成器與協程深度剖析

目錄 生成器 傳統列表 vs 生成器對比 yield機制深度解析 生成器的高級用法 協程的演進:從yield到async/await 基于yield的協程 現代async/await語法 協程的錯誤處理和超時控制 異步生成器與異步迭代器 異步生成器 異步迭代器實現 實戰案例:異步爬蟲框架設計 生成器…

論文解讀:基于 77 GHz FMCW 毫米波雷達的艙內占位檢測

毫米波 (mm-Wave) 雷達是汽車應用&#xff08;例如高級駕駛輔助系統 (ADAS)&#xff09;的一種解決方案。本研究探索了商用毫米波雷達技術在車內應用領域的應用。本文提出了一種基于 77 GHz 毫米波雷達的車輛占用檢測器框架。本研究采用了德州儀器 (Texas Instruments) 的多輸入…

進程優先級(Process Priority)

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄進…

OpenCV的輪廓檢測

1. 輪廓檢測的基本概念輪廓是圖像中連續的、閉合的曲線段&#xff0c;代表物體的邊界&#xff08;如圓形的輪廓是一條閉合曲線&#xff09;。OpenCV 的輪廓檢測通過 cv2.findContours() 實現&#xff0c;可用于形狀識別、物體計數、圖像分割等場景。2. 核心函數與參數&#xff…

亞信安全亮相鴻蒙生態大會2025 攜手鴻蒙生態繪就萬物智聯新藍圖

8 月30 日&#xff0c;以 “新場景?新體驗” 為主題的鴻蒙生態大會 2025 在深圳福田會展中心隆重開幕。本次大會由全球智慧物聯網聯盟&#xff08;GIIC&#xff09;主辦、鴻蒙生態服務&#xff08;深圳&#xff09;有限公司承辦&#xff0c;旨在搭建全球鴻蒙生態伙伴的高層次交…

Linux內核進程管理子系統有什么第四十回 —— 進程主結構詳解(36)

接前一篇文章&#xff1a;Linux內核進程管理子系統有什么第三十九回 —— 進程主結構詳解&#xff08;35&#xff09; 本文內容參考&#xff1a; Linux內核進程管理專題報告_linux rseq-CSDN博客 《趣談Linux操作系統 核心原理篇&#xff1a;第三部分 進程管理》—— 劉超 《…

面試問題:進程和線程,編譯步驟,const,map和unordered_map,深入理解unordered_map

目錄 進程和線程的區別 const修飾指針(左邊內容&#xff0c;右邊指向) 1. const 修飾指針指向的內容&#xff08;指向常量&#xff09; 2. const 修飾指針本身&#xff08;常量指針&#xff09; 3. const 同時修飾指針本身和指向的內容&#xff08;指向常量的常量指針&…

利用棒棒糖圖探索Office (US)的IMDB評分

利用棒棒糖圖探索Office (US)的IMDB評分 import numpy as np import pandas as pd import matplotlib.colors as mc import matplotlib.image as image import matplotlib.pyplot as pltfrom matplotlib.cm import ScalarMappable from matplotlib.lines import Line2D from m…

Zephyr如何注冊設備實例

設備樹 → 編譯期生成 → 運行時訪問 流程圖&#xff1a;Zephyr dev->config 工作流程設備樹 (.dts) ───────────────────────────── anx745139 {compatible "analogix,anx7451";reg <0x39>;reset-gpios <&gpio1 5 …

Spring Boot 日志框架選擇指南:Logback vs Log4j2

在 Spring Boot 應用中&#xff0c;您需要明確選擇一個日志框架 - ??不能同時使用兩種日志實現??。以下是關于 spring-boot-starter-log4j2和 spring-boot-starter-logging的全面比較和選擇建議&#xff1a;核心區別特性spring-boot-starter-log4j2(Log4j2)spring-boot-sta…