spring 之 ServletUriComponentsBuilder

1、来源

ServletUriComponentsBuilder 是 Spring Framework 中用于构建和操作 URI 的一个类,特别适合在基于 Servlet 容器的 Web 应用程序中使用。它主要用于从当前 Servlet 请求上下文中获取相关信息(如主机名、端口、scheme 等),然后构造或修改完整的 URI。

2、作用

1)基于当前请求构建 URI

当需要生成一个与当前请求相关的新的 URI 时,比如创建一个重定向 URL 或是一个 API 资源链接时,可以利用 ServletUriComponentsBuilder 从当前 Servlet 映射提取信息。

2)动态替换路径变量

类似于 MVC 视图中的模型属性,可以在 URI 模板字符串中定义占位符,并通过 .expand() 方法动态地将实际值插入到这些占位符中。

3)处理反向代理

在有 Nginx 等反向代理服务器的情况下,可以通过读取 X-Forwarded-* 标头来正确识别客户端的原始请求信息,从而构建正确的完整 URI。

3、案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;

// 基于当前请求映射构建新URI
URI newLocation = ServletUriComponentsBuilder.fromCurrentServletMapping()
.path("/api/users/{id}")
.buildAndExpand(123) // 替换{id}为实际ID值
.toUri();

// 直接指定主机、端口、路径等构建URI
URI customLocation = ServletUriComponentsBuilder.newInstance()
.scheme("https")
.host("example.com")
.port(443)
.path("/v1/resources")
.build()
.toUri();

// 处理Nginx反向代理,确保构建出的是用户看到的实际URL
// (假设Spring配置已启用对X-Forwarded-*头的支持)
URI proxiedLocation = ServletUriComponentsBuilder.fromCurrentRequest()
.pathSegment("proxied-resource")
.build()
.toUri();