1. 使用HttpServletRequest
UrlPathHelper 解析 出 url路徑
org.springframework.web.util.UrlPathHelper
是 Spring 框架中用于處理 HTTP 請求路徑的一個工具類,它幫助解析和處理與請求路徑相關的細節。特別是 getLookupPathForRequest(HttpServletRequest request)
方法,能夠獲取到與當前請求匹配的路徑,通常用于基于 URL 的路由和控制器匹配。
getLookupPathForRequest(request)
獲取的路徑特點
-
去除上下文路徑和 servlet 路徑:
- 該方法會返回從 URL 中去掉了上下文路徑(context path)和 Servlet 路徑(servlet path)的部分。它通常返回的就是用來路由到特定控制器或資源的匹配路徑。
- 例如,假設有一個請求 URL 為
http://example.com/myapp/api/resource
,其中myapp
是上下文路徑,api
是 servlet 路徑,/resource
是實際的匹配路徑。那么,getLookupPathForRequest
會返回/resource
。
-
與 Handler Mapping 相關:
getLookupPathForRequest
獲取的路徑是基于 Spring MVC 的HandlerMapping
機制來使用的。它通過解析請求的路徑來找到匹配的處理器(如控制器)。這意味著返回的路徑是 Spring MVC 用來路由請求的核心路徑。
-
考慮 URL 解碼:
- 該方法會對 URL 中的編碼字符(如
%20
代表的空格)進行解碼,這樣程序獲得的路徑是實際可讀的路徑,而非編碼的形式。例如,/path%20with%20spaces
會被轉換為/path with spaces
。
- 該方法會對 URL 中的編碼字符(如
-
支持 HTTP 轉發和重定向:
- 在處理
RequestDispatcher
的forward
或include
時,UrlPathHelper
會處理和解析正確的路徑,因此,即便請求是通過內部轉發或者 include 處理的,該方法也能夠返回當前轉發后的路徑。
- 在處理
-
配置靈活性:
UrlPathHelper
允許配置是否應保留 URL 編碼字符、是否要移除矩陣變量(通常以;
為分隔符的 URL 參數),以及是否應忽略上下文路徑等,這使得它在不同的場景下具有很高的靈活性。
代碼解析
StringBuilder reqInfo = new StringBuilder();
UrlPathHelper urlPathHelper = new UrlPathHelper();
String urlPath = urlPathHelper.getLookupPathForRequest(request);
urlPathHelper.getLookupPathForRequest(request)
:獲取請求的匹配路徑,去除上下文和 Servlet 路徑的部分,返回匹配路徑。reqInfo.append(urlPath)
:將該路徑添加到StringBuilder
中,可能用于日志記錄或后續的請求處理。
使用場景
- 路徑匹配與路由:在處理 RESTful API 或 MVC 請求時,用于獲取去除了上下文路徑的匹配路徑,以便路由到合適的控制器。
- 自定義過濾器:在實現自定義過濾器時,可以使用該方法獲取請求的匹配路徑,進行進一步的路徑判斷或權限控制。
- 日志記錄和調試:在處理 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
,則 URLhttp://localhost:8080/myapp/api/hello
將由該Servlet
來處理請求。/api
就是該Servlet
的路徑。
如何配置 Servlet 路徑:
- 你可以通過
@WebServlet
或ServletRegistrationBean
來配置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 或控制器的路徑 | @WebServlet 或 ServletRegistrationBean | 上下文路徑之后的部分 |
路徑的組合關系:
假設配置如下:
- 上下文路徑:
/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
或控制器的具體映射路徑,通常通過@WebServlet
或ServletRegistrationBean
進行配置。
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.