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:
上下文路径为/myappServlet 路径为/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.




