Spring MVC 執行流程詳解:一次請求經歷了什么?

Spring MVC 執行流程詳解:一次請求經歷了什么?

引言

在現代 Web 開發中,Spring MVC 作為 Spring 框架的重要組成部分,廣泛應用于構建靈活、可擴展的 Java Web 應用。作為一個基于 MVC(Model-View-Controller)架構的框架,Spring MVC 提供了強大的請求處理機制,能夠幫助開發者高效地構建 Web 層邏輯。然而,對于初學者或者對底層機制不熟悉的開發者來說,Spring MVC 的執行流程往往顯得神秘而復雜。

本文將深入解析 Spring MVC 的執行流程,從用戶發起 HTTP 請求開始,到最終返回響應為止,詳細探討每一個環節的作用和實現原理。通過這篇文章,你將全面了解 Spring MVC 是如何一步步處理請求的,包括 DispatcherServlet 的作用、HandlerMapping 的匹配機制、Controller 的調用方式、視圖解析與渲染等核心組件的工作原理。

無論你是剛剛接觸 Spring MVC 的新手,還是希望深入了解其內部機制的中級開發者,本文都將為你提供清晰的知識體系和實踐指導。


一、Spring MVC 簡介與基本概念

1.1 什么是 Spring MVC?

Spring MVC 是 Spring 框架中的一個模塊,專門用于構建 Web 應用程序。它基于經典的 Model-View-Controller(MVC)設計模式,旨在分離業務邏輯、數據模型和用戶界面,從而提高代碼的可維護性和可測試性。

在 Spring MVC 中:

  • Model(模型):負責封裝應用的數據和業務邏輯。
  • View(視圖):負責展示數據,通常為 HTML 頁面或 JSON 數據。
  • Controller(控制器):接收用戶的請求,協調 Model 和 View,完成業務邏輯并返回適當的視圖。

1.2 Spring MVC 的核心組件

Spring MVC 的運行依賴于多個核心組件協同工作,主要包括:

  • DispatcherServlet:前端控制器,是整個請求處理的核心入口。
  • HandlerMapping:處理器映射器,負責根據請求 URL 找到對應的 Controller。
  • Controller:實際處理請求的類,通常使用 @Controller@RestController 注解標記。
  • ViewResolver:視圖解析器,負責將邏輯視圖名解析為實際的視圖對象(如 JSP、Thymeleaf 等)。
  • View:視圖對象,負責將模型數據渲染成客戶端可識別的格式(如 HTML、JSON 等)。
  • HandlerAdapter:處理器適配器,負責調用具體的 Controller 方法。
  • HandlerExceptionResolver:異常解析器,用于處理 Controller 拋出的異常。
  • LocaleResolver:本地化解析器,用于支持多語言。
  • ThemeResolver:主題解析器,用于支持不同的 UI 主題。

這些組件構成了 Spring MVC 的骨架,它們之間通過一定的流程進行協作,從而完成一次完整的請求處理。


二、Spring MVC 的執行流程概覽

Spring MVC 的執行流程可以分為以下幾個主要步驟:

  1. 用戶發送 HTTP 請求 到服務器。
  2. DispatcherServlet 接收請求,作為前端控制器,它是所有請求的統一入口。
  3. HandlerMapping 查找對應的 Controller,根據請求的 URL 匹配合適的處理器。
  4. HandlerAdapter 調用 Controller,執行具體的業務邏輯。
  5. Controller 返回 ModelAndView 對象,包含模型數據和視圖信息。
  6. ViewResolver 解析視圖名稱,找到實際的視圖資源(如 JSP 文件)。
  7. View 渲染模型數據,生成最終的響應內容(如 HTML 頁面)。
  8. DispatcherServlet 將響應返回給客戶端

接下來我們將逐個步驟進行詳細分析。


三、DispatcherServlet:前端控制器

3.1 什么是 DispatcherServlet?

DispatcherServlet 是 Spring MVC 的核心組件之一,它是 Servlet 的子類,繼承自 HttpServlet。它的職責是接收所有的 HTTP 請求,并協調其他組件完成整個請求的處理過程。

在傳統的 Web 應用中,每個請求都可能由不同的 Servlet 處理。而在 Spring MVC 中,所有的請求都會首先被 DispatcherServlet 攔截,然后由它決定如何分發和處理這些請求。

3.2 DispatcherServlet 的配置

web.xml 中,我們需要配置 DispatcherServlet 并指定其映射路徑。例如:

<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

在這個例子中,我們配置了一個名為 dispatcherDispatcherServlet,并將其映射到 / 路徑,表示它可以處理所有進入的請求。contextConfigLocation 參數指定了 Spring 配置文件的位置。

3.3 DispatcherServlet 的初始化

當 Web 容器(如 Tomcat)啟動時,DispatcherServlet 會加載其關聯的 Spring 配置文件(通常是 <servlet-name>-servlet.xml),并初始化一系列的組件,如 HandlerMapping、ViewResolver、HandlerAdapter 等。

這些組件在后續的請求處理過程中將發揮關鍵作用。


四、HandlerMapping:處理器映射器

4.1 HandlerMapping 的作用

HandlerMapping 的作用是根據請求的 URL 找到對應的 Controller 類和方法。Spring MVC 支持多種類型的 HandlerMapping,最常見的是:

  • BeanNameUrlHandlerMapping:根據 Bean 名稱來映射 URL。
  • SimpleUrlHandlerMapping:手動配置 URL 與 Controller 的映射關系。
  • RequestMappingHandlerMapping:基于注解的方式(如 @RequestMapping@GetMapping@PostMapping 等)來匹配 URL。

其中,RequestMappingHandlerMapping 是默認使用的 HandlerMapping,它會掃描所有帶有 @RequestMapping 注解的類和方法,并建立 URL 與 Controller 的映射關系。

4.2 HandlerMapping 的工作機制

DispatcherServlet 接收到請求后,會調用 getHandler() 方法獲取對應的處理器(Handler)。這個方法會遍歷所有的 HandlerMapping 實例,直到找到第一個能夠處理該請求的 Handler。

RequestMappingHandlerMapping 為例,它會檢查請求的 URL 是否與某個 @RequestMapping 注解的方法匹配。如果匹配成功,則返回一個封裝了目標 Controller 及其方法的 HandlerExecutionChain 對象。

例如:

@GetMapping("/hello")
public String sayHello() {return "hello";
}

當訪問 /hello 時,RequestMappingHandlerMapping 會找到這個方法,并將其封裝為一個 Handler。


五、HandlerAdapter:處理器適配器

5.1 HandlerAdapter 的作用

HandlerAdapter 的作用是調用具體的 Controller 方法,并處理其返回值。由于 Spring MVC 支持多種類型的 Controller(如基于注解的 Controller、基于接口的 Controller 等),因此需要不同的 HandlerAdapter 來適配不同類型的處理器。

常見的 HandlerAdapter 包括:

  • HttpRequestHandlerAdapter
  • SimpleControllerHandlerAdapter
  • AnnotationMethodHandlerAdapter(舊版本)
  • RequestMappingHandlerAdapter(新版本)

目前最常用的是 RequestMappingHandlerAdapter,它用于處理基于注解的 Controller 方法。

5.2 HandlerAdapter 的調用流程

一旦 DispatcherServlet 獲取到了 Handler,它就會調用 getHandlerAdapter() 方法,找到能夠處理當前 Handler 的適配器。隨后調用 handle() 方法,真正執行 Controller 中的方法。

例如,在 RequestMappingHandlerAdapter 內部,會調用 invokeHandlerMethod() 方法來反射執行 Controller 方法,并處理參數綁定、返回值處理等工作。


六、Controller:處理請求的邏輯中心

6.1 Controller 的定義方式

在 Spring MVC 中,Controller 可以通過以下幾種方式定義:

  • 使用 @org.springframework.stereotype.Controller 注解標注的類。
  • 使用 @org.springframework.web.bind.annotation.RestController 注解,適用于 RESTful API。
  • 實現 Controller 接口(不推薦)。
  • 實現 HttpRequestHandler 接口(也不推薦)。

推薦使用 @Controller@RestController,因為它們更簡潔、易讀,并且與 Spring 的自動掃描機制兼容。

6.2 Controller 的請求處理

Controller 的方法可以通過各種注解來指定請求類型、URL 映射、參數綁定等行為,例如:

@RestController
public class HelloController {@GetMapping("/hello")public String sayHello(@RequestParam String name) {return "Hello, " + name;}
}

在這個例子中:

  • @RestController 表示這是一個 REST 控制器,返回值直接寫入 HTTP 響應體。
  • @GetMapping("/hello") 表示該方法處理 GET 請求,路徑為 /hello
  • @RequestParam String name 表示從請求參數中提取 name 參數。

當用戶訪問 /hello?name=Tom 時,Spring MVC 會自動將 name 參數注入到方法中,并返回 "Hello, Tom"


七、ModelAndView:模型與視圖的載體

7.1 ModelAndView 的結構

ModelAndView 是 Spring MVC 中用于封裝模型數據和視圖信息的對象。它包含兩個部分:

  • Model:存儲模型數據,通常是一個 Map 結構,鍵值對形式。
  • View:表示視圖信息,可以是視圖名稱或實際的視圖對象。

7.2 ModelAndView 的創建與使用

Controller 可以通過返回 ModelAndView 對象來同時傳遞模型數據和指定視圖。例如:

@Controller
public class UserController {@GetMapping("/user/{id}")public ModelAndView getUser(@PathVariable Long id) {User user = userService.findById(id);ModelAndView modelAndView = new ModelAndView("userDetail");modelAndView.addObject("user", user);return modelAndView;}
}

在這個例子中,userDetail 是視圖名稱,modelAndView.addObject("user", user) 將用戶對象添加到模型中。


八、ViewResolver:視圖解析器

8.1 ViewResolver 的作用

ViewResolver 的作用是將邏輯視圖名解析為實際的視圖對象。Spring MVC 提供了多種內置的 ViewResolver,如:

  • InternalResourceViewResolver:用于解析 JSP 視圖。
  • ThymeleafViewResolver:用于解析 Thymeleaf 模板。
  • FreeMarkerViewResolver:用于解析 FreeMarker 模板。
  • VelocityViewResolver:用于解析 Velocity 模板。

8.2 ViewResolver 的配置與使用

InternalResourceViewResolver 為例,通常在 Spring 配置文件中這樣配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/" /><property name="suffix" value=".jsp" />
</bean>

這樣,當 Controller 返回 "userDetail" 時,ViewResolver 會將其解析為 /WEB-INF/views/userDetail.jsp


九、View:視圖的渲染

9.1 View 的作用

View 是 Spring MVC 中用于渲染模型數據的實際視圖對象。它負責將模型數據轉換為客戶端可以理解的格式(如 HTML、JSON 等)。

常見的 View 實現包括:

  • JstlView:用于渲染 JSP 頁面。
  • JsonView:用于輸出 JSON 格式的數據。
  • AbstractTemplateView:用于模板引擎(如 Thymeleaf、Freemarker)。

9.2 View 的渲染過程

ViewResolver 找到對應的 View 后,DispatcherServlet 會調用 render() 方法,將模型數據傳入視圖進行渲染。

例如,對于 JSP 頁面,模型數據會被放入 request.setAttribute() 中,然后通過 JSP EL 表達式顯示出來:

<h1>User Detail</h1>
<p>Name: ${user.name}</p>
<p>Email: ${user.email}</p>

十、異常處理與錯誤頁面

10.1 HandlerExceptionResolver 的作用

HandlerExceptionResolver 是 Spring MVC 中用于處理 Controller 拋出異常的組件。它可以在發生異常時返回特定的視圖或錯誤碼。

常見的實現類包括:

  • SimpleMappingExceptionResolver:根據異常類型映射到特定視圖。
  • ResponseStatusExceptionResolver:處理帶有 @ResponseStatus 注解的異常。
  • DefaultHandlerExceptionResolver:處理 Spring 自身拋出的標準異常。

10.2 全局異常處理(@ControllerAdvice)

從 Spring 3.2 開始,可以使用 @ControllerAdvice 注解實現全局異常處理:

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)public ModelAndView handleResourceNotFound() {ModelAndView modelAndView = new ModelAndView("error/404");return modelAndView;}@ExceptionHandler(Exception.class)public ModelAndView handleGeneralError() {ModelAndView modelAndView = new ModelAndView("error/general");return modelAndView;}
}

這樣可以集中處理異常,避免在每個 Controller 中重復編寫異常處理邏輯。


十一、國際化支持(LocaleResolver)

11.1 LocaleResolver 的作用

LocaleResolver 用于確定當前請求的語言環境(Locale),從而支持多語言切換。常見的實現類包括:

  • AcceptHeaderLocaleResolver:基于 HTTP 請求頭中的 Accept-Language 字段。
  • CookieLocaleResolver:基于 Cookie 中保存的 Locale。
  • SessionLocaleResolver:基于 Session 中保存的 Locale。

11.2 配置 LocaleResolver

在 Spring 配置文件中配置:

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"><property name="defaultLocale" value="en"/>
</bean>

還可以配合 LocaleChangeInterceptor 實現動態切換語言:

<mvc:interceptors><bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"><property name="paramName" value="lang"/></bean>
</mvc:interceptors>

這樣,用戶可以通過 ?lang=en?lang=zh 來切換語言。


十二、攔截器(HandlerInterceptor)

12.1 攔截器的作用

攔截器(HandlerInterceptor)允許我們在請求到達 Controller 之前或之后執行一些通用邏輯,例如權限驗證、日志記錄、性能監控等。

12.2 攔截器的生命周期

攔截器有三個主要方法:

  • preHandle():在 Controller 方法執行前調用,返回值為布爾值,決定是否繼續執行后續流程。
  • postHandle():在 Controller 方法執行后調用,但視圖尚未渲染。
  • afterCompletion():在整個請求完成后調用,可用于釋放資源。

12.3 自定義攔截器示例

@Component
public class LoggingInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Request URL: " + request.getRequestURL());return true; // 繼續執行}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Post Handle method called.");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("Request completed.");}
}

在配置文件中注冊攔截器:

<mvc:interceptors><bean class="com.example.LoggingInterceptor"/>
</mvc:interceptors>

十三、總結:一次請求的完整流程回顧

現在我們已經詳細介紹了 Spring MVC 的各個核心組件及其作用。為了加深理解,我們可以再次回顧一次完整的請求流程:

  1. 用戶在瀏覽器中輸入 URL,發送 HTTP 請求。
  2. 請求被 DispatcherServlet 攔截。
  3. DispatcherServlet 調用 HandlerMapping,查找匹配的 Controller。
  4. 找到對應的 Controller 后,DispatcherServlet 調用 HandlerAdapter 來執行 Controller 方法。
  5. Controller 方法執行完畢后返回 ModelAndView
  6. ViewResolver 解析視圖名稱,定位實際的視圖資源。
  7. View 渲染模型數據,生成 HTML、JSON 等響應內容。
  8. 最終響應通過 DispatcherServlet 返回給客戶端。
  9. 整個過程中還可能涉及異常處理、攔截器、國際化等功能。

十四、結語

通過對 Spring MVC 執行流程的深入剖析,我們可以更好地理解其背后的機制和組件之間的協作關系。掌握這些知識不僅有助于我們寫出更高效的代碼,也能在調試和優化性能時提供有力的支持。

如果你正在學習 Spring MVC 或者正在開發企業級 Web 應用,建議你結合源碼閱讀和實際項目經驗,進一步加深對這些組件的理解。隨著你對 Spring 生態系統的不斷深入,你會發現 Spring MVC 的強大之處遠不止于此。

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

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

相關文章

Vue 3的核心機制-解析事件流、DOM更新、數據請求、DOM操作規范及組件庫DOM操作的解決方案

文章目錄概要整體介紹vue 中dom操作推薦方案實例概要 從Vue 3的核心機制出發&#xff0c;結合場景、應用與實例&#xff0c;系統化解析事件流、DOM更新、數據請求、DOM操作規范及組件庫DOM操作的解決方案&#xff1a; 整體介紹 ?? 一、事件流處理機制 核心機制 ? 三個階段…

Python從入門到高手9.2節-Python字典的操作方法

目錄 9.2.1 字典的操作 9.2.2 字典的查找 9.2.3 字典的修改 9.2.4 字典的添加 9.2.5 字典的刪除 9.2.6 今天你逛街了嗎 9.2.1 字典的操作 字典類型是一種抽象數據類型&#xff0c;抽象數據類型定義了數據類型的操作方法&#xff0c;在本節的內容中&#xff0c;教同學們徹…

omniparser v2 本地部署及制作docker鏡像(20250715)

關于 omniparser v2 本地部署&#xff0c;網上資料不算多&#xff0c;尤其是對于土薔內用戶&#xff0c;還是有些坑的。 1、安裝步驟 可參考兩個CSDN博客&#xff1a; &#xff08;1&#xff09;大模型實戰 - ‘OmniParser-V2本地部署安裝 鏈接 &#xff08;2&#xff09;…

自己寫個 `rsync` + `fswatch` 實時增量同步腳本,干掉 Cursor AI、Sublime Text 的SFTP等 插件!

自己寫個 rsync fswatch 實時增量同步腳本&#xff0c;干掉 Cursor AI、Sublime Text 的 SFTP等 插件&#xff01; 作為一個碼農&#xff0c;我最頭疼的事情之一就是編輯器同步代碼到服務器這塊。用過各種各樣的sftp、rsync插件&#xff0c;感覺不好用。。 我琢磨著&#xff1…

linux中at命令的常用用法。

Linux 中 at 命令用于安排一次性定時任務&#xff0c;需要用到在某個時間只需要執行一次的命令的時候&#xff0c;可以使用at 1&#xff1a;安裝at # Debian/Ubuntu sudo apt install at# CentOS/RHEL sudo yum install at2&#xff1a;啟動at sudo systemctl start atd # 啟…

【安卓筆記】RxJava的使用+修改功能+搭配retrofit+RxView防快速點擊

0. 環境&#xff1a; 電腦&#xff1a;Windows10 Android Studio: 2024.3.2 編程語言: Java Gradle version&#xff1a;8.11.1 Compile Sdk Version&#xff1a;35 Java 版本&#xff1a;Java11 1. 介紹RxJava GitHub開源地址&#xff1a;https://github.com/Reactive…

Windows 下原生使用 claude code + Kimi K2

搞定了kimi k2 claude code在windows下原生使用 Windows下使用claude code的障礙是shell環境&#xff08;命令行&#xff09;&#xff0c;非posix風格shell無法正常讓claude code讀取到url和key, 導致無法使用。解決問題的本質是使用符合posix風格的shell環境&#xff0c;我們…

Leetcode Easy題小解(C++語言描述)1

Leetcode Easy題小解&#xff08;C語言描述&#xff09; 相交鏈表 給你兩個單鏈表的頭節點 headA 和 headB &#xff0c;請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表不存在相交節點&#xff0c;返回 null 。 圖示兩個鏈表在節點 c1 開始相交**&#xff1a;**題目數據…

EP01:【NLP 第二彈】自然語言處理概述

一、NLP通向智能之路 1.1 圖靈測試 1.1.1 提出背景 由計算機科學家阿蘭?圖靈于 1950 年提出&#xff0c;是早期衡量機器智能水平的重要概念。 1.1.2 提出目的 判斷機器是否能表現出與人類相當的智能行為。 1.1.3 測試原理 場景設定&#xff1a;測試中存在一位人類測試者&#…

Ansible 查看PostgreSQL的版本

Ansible的基礎知識就不說了直接貼劇本- name: Check PostgreSQL versionhosts: db_serversbecome: yesvars:ansible_python_interpreter: /usr/bin/python3db_name: postgresdb_user: postgresdb_password: your_passwordtasks:- name: Install psycopg2ansible.builtin.packag…

【視覺SLAM筆記】第9章 后端1

一、理論1. 狀態估計的概率解釋我們來深入探討一下視覺SLAM中狀態估計的概率解釋。這可以說是理解現代SLAM算法&#xff08;尤其是后端優化&#xff09;的基石1. 問題的核心&#xff1a;不確定性SLAM&#xff08;同步定位與建圖&#xff09;的本質是在一個未知環境中&#xff0…

(數據結構)復雜度

基本概念說明 數據結構 定義&#xff1a;數據結構(Data Structure)是計算機存儲、組織數據的方式&#xff0c;指相互之間存在?種或多種特定關系的數據元素的集合。沒有?種單?的數據結構對所有用途都有用&#xff08;要考慮適配、效率問題&#xff0c;在不同情況下使用合適的…

玩轉Docker | 使用Docker部署bender個人導航頁工具

玩轉Docker | 使用Docker部署bender個人導航頁工具 前言 一、bender介紹 Bender 簡介 Bender 的主要特點 二、系統要求 環境要求 環境檢查 Docker版本檢查 檢查操作系統版本 三、部署bender服務 下載bender鏡像 編輯部署文件 創建容器 檢查容器狀態 檢查服務端口 安全設置 四、…

解決了困擾我的upload靶場無法解析phtml等后綴的問題

本文章為解決困擾我的 upload 靶場無法解析 phtml 問題 ? 這個問題直接讓我過不了Upload-Pass-03這一關&#xff0c;一直卡著。 ? 痛太痛了 &#xff0c;為什么無法解析上傳之后的 phtml 后綴文件&#xff01;這塊兒折磨了博主一天多&#xff0c;太不容易了&#xff0c;查找…

Leetcode百題斬-二分搜索

二分搜索也是一個很有趣的專題&#xff0c;被做過的題中&#xff0c;剛好一個Easy&#xff0c;一個Medium和一個Hard&#xff0c;剛好可以看看&#xff0c;二分搜索的三個難度等級都是啥樣的。 124. Binary Tree Maximum Path Sum[Hard]&#xff08;詳見二叉樹專題&#xff09;…

【IDEA】格式化代碼工具配置

格式化代碼快捷鍵&#xff1a; CtrlAltL格式代碼的時候不會再方法名與參數中間添加空格默認不勾選的情況下&#xff1a;代碼樣例&#xff1a;勾選之后的樣例&#xff1a;選擇不勾選&#xff0c;IDEA默認情況下就是不勾選的狀態忽略加載文件有些非必要加載到開發工具中的文件我們…

驅動開發(3)|rk356x驅動GPIO基礎應用之點亮led燈

點亮LED燈看似是一個基礎的操作&#xff0c;但實際上&#xff0c;許多高級應用也依賴于高低電平的切換。例如&#xff0c;脈沖寬度調制&#xff08;PWM&#xff09;信號可以用來精確控制電機的轉速&#xff0c;通過改變脈沖的頻率和占空比&#xff0c;實現對電機的精確調節&…

手動搭建PHP環境:步步為營,解鎖Web開發

目錄一、引言二、準備工作2.1 明確所需軟件2.2 下載軟件三、Windows 系統搭建步驟3.1 安裝 Apache 服務器3.2 安裝 PHP3.3 集成 Apache 與 PHP3.4 安裝 MySQL3.5 配置 PHP 連接 MySQL四、Linux 系統搭建步驟&#xff08;以 Ubuntu 為例&#xff09;4.1 更新系統4.2 安裝 Apache…

DrissionPage:一款讓網頁自動化更簡單的 Python 庫

在網頁自動化領域&#xff0c;Selenium 和 Playwright 早已是開發者耳熟能詳的工具。但今天要給大家介紹一款更輕量、更易用的 Python 庫 ——DrissionPage。它以 "融合 selenium 和 requests 優勢" 為核心設計理念&#xff0c;既能像 requests 一樣高效處理靜態網頁…

理解Grafana中`X-Scope-OrgID`的作用與配置

X-Scope-OrgID的作用 該HTTP Header用于標識Loki日志數據的所屬租戶&#xff08;組織&#xff09;。在多租戶模式下&#xff0c;Loki通過此Header隔離不同團隊或用戶的數據&#xff0c;確保查詢和存儲的獨立性。數據隔離&#xff1a; 租戶A的日志標記為X-Scope-OrgID: team-a&a…