uri-url-HttpServletRequest

1. 使用HttpServletRequest

UrlPathHelper 解析 出 url路徑

org.springframework.web.util.UrlPathHelper 是 Spring 框架中用于處理 HTTP 請求路徑的一個工具類,它幫助解析和處理與請求路徑相關的細節。特別是 getLookupPathForRequest(HttpServletRequest request) 方法,能夠獲取到與當前請求匹配的路徑,通常用于基于 URL 的路由和控制器匹配。

getLookupPathForRequest(request) 獲取的路徑特點

  1. 去除上下文路徑和 servlet 路徑

    • 該方法會返回從 URL 中去掉了上下文路徑(context path)和 Servlet 路徑(servlet path)的部分。它通常返回的就是用來路由到特定控制器或資源的匹配路徑。
    • 例如,假設有一個請求 URL 為 http://example.com/myapp/api/resource,其中 myapp 是上下文路徑,api 是 servlet 路徑,/resource 是實際的匹配路徑。那么,getLookupPathForRequest 會返回 /resource
  2. 與 Handler Mapping 相關

    • getLookupPathForRequest 獲取的路徑是基于 Spring MVC 的 HandlerMapping 機制來使用的。它通過解析請求的路徑來找到匹配的處理器(如控制器)。這意味著返回的路徑是 Spring MVC 用來路由請求的核心路徑。
  3. 考慮 URL 解碼

    • 該方法會對 URL 中的編碼字符(如 %20 代表的空格)進行解碼,這樣程序獲得的路徑是實際可讀的路徑,而非編碼的形式。例如,/path%20with%20spaces 會被轉換為 /path with spaces
  4. 支持 HTTP 轉發和重定向

    • 在處理 RequestDispatcherforwardinclude 時,UrlPathHelper 會處理和解析正確的路徑,因此,即便請求是通過內部轉發或者 include 處理的,該方法也能夠返回當前轉發后的路徑。
  5. 配置靈活性

    • UrlPathHelper 允許配置是否應保留 URL 編碼字符、是否要移除矩陣變量(通常以 ; 為分隔符的 URL 參數),以及是否應忽略上下文路徑等,這使得它在不同的場景下具有很高的靈活性。

代碼解析

StringBuilder reqInfo = new StringBuilder();
UrlPathHelper urlPathHelper = new UrlPathHelper();
String urlPath = urlPathHelper.getLookupPathForRequest(request);
  • urlPathHelper.getLookupPathForRequest(request):獲取請求的匹配路徑,去除上下文和 Servlet 路徑的部分,返回匹配路徑。
  • reqInfo.append(urlPath):將該路徑添加到 StringBuilder 中,可能用于日志記錄或后續的請求處理。

使用場景

  1. 路徑匹配與路由:在處理 RESTful API 或 MVC 請求時,用于獲取去除了上下文路徑的匹配路徑,以便路由到合適的控制器。
  2. 自定義過濾器:在實現自定義過濾器時,可以使用該方法獲取請求的匹配路徑,進行進一步的路徑判斷或權限控制。
  3. 日志記錄和調試:在處理 HTTP 請求時,提取路徑信息進行日志記錄和調試,尤其是在復雜的 URL 路由或轉發時。

總結來說,UrlPathHelper.getLookupPathForRequest 提供了一個靈活且精準的方式來解析請求路徑,幫助開發者在 Spring 應用中處理基于路徑的邏輯和路由。

2. 上下文路徑和Servlet 路徑的區別

在 Spring 和 Java Web 應用中,上下文路徑(Context Path)Servlet 路徑(Servlet Path) 是兩個常見的路徑概念,它們定義了應用和特定 Servlet 的 URL 結構。

1. 上下文路徑(Context Path)

  • 定義:上下文路徑是指應用部署到服務器中的根路徑,所有請求都必須以該路徑為前綴才能訪問該應用。
  • 作用:它決定了應用的訪問根路徑,通常用于區分同一服務器中不同的應用。
示例:
  • 假設上下文路徑是 /myapp,那么請求 http://localhost:8080/myapp 就會到達該應用。如果沒有配置,上下文路徑默認為 /(根路徑),即應用直接從服務器的根目錄開始訪問。
如何配置上下文路徑
  • application.properties 中配置
    server.servlet.context-path=/myapp
    
  • application.yml 中配置
    server:servlet:context-path: /myapp
    

在這個例子中,應用的上下文路徑被設置為 /myapp,所有請求必須以 /myapp 開頭才能路由到該應用。

2. Servlet 路徑(Servlet Path)

  • 定義Servlet 路徑是指應用中的某個具體 Servlet 或控制器處理的 URL 路徑,它是在上下文路徑之后的部分,決定了哪個 Servlet 或控制器處理特定的請求。
  • 作用:它用于將特定的請求路由到相應的 Servlet 或控制器進行處理。
示例:
  • 假設某個 Servlet 映射路徑為 /api/*,并且上下文路徑為 /myapp,則 URL http://localhost:8080/myapp/api/hello 將由該 Servlet 來處理請求。/api 就是該 Servlet 的路徑。
如何配置 Servlet 路徑
  • 你可以通過 @WebServletServletRegistrationBean 來配置 Servlet 路徑。

通過 @WebServlet 注解配置

@WebServlet(urlPatterns = "/api/*")
public class MyServlet extends HttpServlet {// 處理請求
}

通過 ServletRegistrationBean 動態注冊 Servlet

@Bean
public ServletRegistrationBean<MyServlet> myServlet() {return new ServletRegistrationBean<>(new MyServlet(), "/api/*");
}

3. 上下文路徑和 Servlet 路徑的區別

路徑類型作用范圍配置方式請求中的位置
上下文路徑定義整個應用在服務器上的根路徑server.servlet.context-path請求的開頭部分
Servlet 路徑定義應用內某個 Servlet 或控制器的路徑@WebServletServletRegistrationBean上下文路徑之后的部分
路徑的組合關系

假設配置如下:

  • 上下文路徑:/myapp
  • Servlet 路徑:/api/*

當訪問 http://localhost:8080/myapp/api/hello

  • 上下文路徑/myapp
  • Servlet 路徑/api/hello

Spring 的 UrlPathHelper.getLookupPathForRequest(request) 會去除上下文路徑 /myapp 和 Servlet 路徑中的 /api,返回的 lookup path 就是 /hello

4. 總結

  • 上下文路徑 是整個應用的根路徑,可以通過 server.servlet.context-path 配置。
  • Servlet 路徑 是應用內某個 Servlet 或控制器的具體映射路徑,通常通過 @WebServletServletRegistrationBean 進行配置。

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

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

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

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

相關文章

Ubuntu22.04安裝p4顯卡 nvidia-utils-570-server 570.133.20驅動CUDA Version: 12.8

Ubuntu22.04安裝p4顯卡 nvidia-utils-570-server 570.133.20驅動CUDA Version: 12.8專業顯卡就是專業顯卡&#xff0c;盡管p4已經掉到了白菜價&#xff0c;官方的支持卻一直都保持&#xff0c;比如它可以裝上cuda12.8,這真的出乎我意料。NVIDIA Tesla P4顯卡的主要情況Pascal架…

工業日志AI大模型智能分析系統-前端實現

目錄 主要架構 前端項目結構 1. 核心實現代碼 1.1 API服務封裝 (src/api/log.ts) 1.2 TS類型定義 (src/types/api.ts) 1.3 Pinia狀態管理 (src/stores/logStore.ts) 1.4 日志分析頁面 (src/views/LogAnalysis.vue) 1.5 日志詳情組件 (src/components/LogDetail.vue) 2…

C++內存泄漏排查

引言 C內存泄漏問題的普遍性與危害內存泄漏排查大賽的背景與目標文章結構和主要內容概述 內存泄漏的基本概念 內存泄漏的定義與類型&#xff08;顯式、隱式、循環引用等&#xff09;C中常見的內存泄漏場景&#xff08;指針管理不當、資源未釋放等&#xff09;內存泄漏對程序性能…

20250706-4-Docker 快速入門(上)-常用容器管理命令_筆記

一、常用管理命令1. 選項&#xfeff;&#xfeff;1&#xff09;ls&#xfeff;功能&#xff1a;列出容器常用參數&#xff1a;-a&#xff1a;查看所有容器包含退出的-q&#xff1a;列出所有容器ID-l&#xff1a;列出最新創建的容器狀態使用技巧&#xff1a;容器很多時使用dock…

基于 Camunda BPM 的工作流引擎示例項目

項目介紹 這是一個基于 Camunda BPM 的工作流引擎示例項目&#xff0c;包含完整的后臺接口和前端頁面&#xff0c;實現了流程的設計、部署、執行等核心功能。 技術棧 后端 Spring Boot 2.7.9Camunda BPM 7.18.0MySQL 8.0JDK 1.8 前端 Vue 3Element PlusBpmn.jsVite 功能…

Day06_刷題niuke20250707

試卷01&#xff1a; 單選題 C 1. 在C中,一個程序無論由多少個源程序文件組成,其中有且僅有一個主函數main().說法是否正確&#xff1f; A 正確 B 錯誤 正確答案&#xff1a;A 官方解析&#xff1a; 在C程序設計中,一個完整的程序確實有且僅有一個main函數作為程序的入口點,這…

洛谷 P5788 【模板】單調棧

題目背景模板題&#xff0c;無背景。2019.12.12 更新數據&#xff0c;放寬時限&#xff0c;現在不再卡常了。題目描述給出項數為 n 的整數數列 a1…n?。定義函數 f(i) 代表數列中第 i 個元素之后第一個大于 ai? 的元素的下標&#xff0c;即 f(i)mini<j≤n,aj?>ai??{…

linux系統運行時_安全的_備份_還原_方法rsync

1.問題與需求 問題: 新部署的機器設備(主控RK3588), 沒有經過燒錄定制鏡像, 研發部署, 直接組裝發送到客戶現場需要通過frpc遠程部署: 安裝ros2 python包 docker鏡像 環境配置 自啟動配置 SN設備信息寫自動部署腳本, 實現一鍵部署升級無奈物聯網卡做了白名單限制, apt 和…

18套精美族譜Excel模板,助力家族文化傳承!

【資源分享】18套精美族譜Excel模板&#xff0c;助力家族文化傳承&#xff01; &#x1f3af; 本文分享一套完整的家族譜系資源&#xff0c;包含18個精心設計的Excel模板&#xff0c;從基礎模板到專業圖表&#xff0c;滿足各類家族的族譜制作需求。 一、為什么要制作族譜&…

MySQL Galera Cluster企業級部署

一、MySQL Galera Cluster簡介 主要特點 同步復制&#xff1a; 所有的寫操作&#xff08;包括插入、更新、刪除&#xff09;在集群中的所有節點上都是同步的。這意味著每個節點上的數據是完全一致的。 多主節點&#xff1a; 集群中的每個節點都是主節點。所有節點都可以處理讀…

HTTP 重定向

什么是 HTTP 重定向&#xff1f; HTTP 重定向&#xff08;HTTP Redirect&#xff09; 是服務器向客戶端&#xff08;通常是瀏覽器&#xff09;發出的指令&#xff0c;告訴客戶端某個請求的資源已被移到新的位置。重定向通常通過發送一個特殊的 HTTP 狀態碼&#xff08;例如 3x…

本地加載非在線jar包設置

項目中存在私有jar包&#xff0c;提示在線獲取不到&#xff0c;需要先獲取到完整的jar包在打進maven中再在項目中進行maven依賴引入 mvn install:install-file -DfileD:\tools\maven\apache-maven-3.5.2\local_repository2\org\ahjk\SixCloudCommon\1.0\SixCloudCommon-1.0-SN…

Codeforces Round 979 (Div. 2)

A c[1]-b[1]0&#xff0c;之后每個c[1]-b[1]最大都是maxa-mina&#xff0c;最大和最小放前兩個 B ans2^(a1)-2^s-1&#xff0c;1一個最小 C 我們可以把式子化為(....)||(....)||(....)括號里沒有||&#xff0c;如果括號全是1那么A贏&#xff0c;A盡量選擇把1選在一起 D …

UI前端大數據處理性能瓶頸突破:分布式計算框架的應用

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;前端大數據處理的性能困境與破局之路在數據爆炸增長的時代&#xff0c;UI…

病蟲害數據集

數據是泰迪杯主辦方提供的已經標記好的數據&#xff0c;4k畫質的圖片&#xff0c;總大小8個G 鏈接&#xff1a;https://pan.baidu.com/s/1fvmNHGrLvflEovjfCjDLOw?pwd6666 提取碼&#xff1a;6666 蟲害包括&#xff1a; 八點灰燈蛾 褐飛虱屬 白背飛虱 二化螟 蟋蟀 黃足…

JAVA基礎:關于JDK環境變量設置的若干相關細節及注意事項

一、JDK下載安裝 網址&#xff1a;https://www.oracle.com/java/technologies/downloads/ 以 win11 為例&#xff0c;根據網址下載安裝包后&#xff0c;點擊安裝&#xff0c;注意設置安裝路徑 二、基礎常識 1.Java三大使用平臺 Java SE(Java Standard Edition): 標準版&…

C++高頻知識點(四)

文章目錄 16. 虛基類要解決什么問題&#xff1f;17. C中如何進行類型轉換操作&#xff1f;列舉并解釋四種類型轉換方式。18. 什么是函數重載&#xff1f;如何進行函數重載&#xff1f;19. 解釋C中的友元函數和友元類&#xff0c;并解釋其使用場景。友元函數友元類 20. 請解釋C中…

【Servlet資源轉發介紹】

文章目錄 前言一、Servlet 資源轉發是什么&#xff1f;1. 為什么要資源轉發&#xff1f; 二、資源轉發 vs 重定向三、如何使用 RequestDispatcher 進行資源轉發1. 引入依賴2. 獲取 RequestDispatcher3. forward 示例4. include 示例JSP 中 include 指令或動作Servlet 中 includ…

牛客周賽 Round 99題解

Round 99 思路&#xff1a;我們之間去用字符串去統計即可&#xff0c;輸入一個字符串&#xff0c;看相鄰有沒有99即可 #include<bits/stdc.h> using namespace std; #define int long long string s; signed main() {cin>>s;int ns.size();for(int i1;i<n;i){i…

AR 如何改變我們構建網站的方式

想坐在沙發上試鞋子&#xff1f;歡迎來到 Web AR 的世界。還記得你在網頁上逛商城時&#xff0c;點擊一副墨鏡&#xff0c;然后鏡頭打開&#xff0c;它就自動出現在你臉上的那一瞬間嗎&#xff1f;不需要下載 App&#xff0c;不需要跳轉&#xff0c;只需一個瀏覽器。這不是科幻…