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.