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.

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值