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.

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值