Spring WebFlux:含代理场景下,是否有方法从请求提取源主机构建链接?
在Spring WebFlux中提取原始请求的源主机与URL
好问题!在Spring WebFlux里,其实已经有现成的工具来帮你处理直接请求和代理转发请求这两种场景,不用手动去解析一堆请求头那么麻烦。下面分两种方式给你说明:
1. 全局配置ForwardedHeaderFilter(推荐)
这个Filter会自动帮你处理X-Forwarded-Host、X-Forwarded-Path这类代理头,把请求的URI、主机信息修正为客户端原始请求的内容,后续你直接拿请求对象的信息就好。
首先在你的配置类里注册这个Filter:
@Bean public FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter() { FilterRegistrationBean<ForwardedHeaderFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new ForwardedHeaderFilter()); // 设置优先级,确保它在其他Filter之前执行 registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); return registrationBean; }
2. 在处理方法中获取原始请求信息
配置完Filter之后,你可以直接从ServerRequest里拿到修正后的请求数据,不管是直接请求还是代理转发的都适用:
public Mono<ServerResponse> getIndex(ServerRequest request) { // 从ServerRequest获取底层的ServerHttpRequest ServerHttpRequest httpRequest = request.exchange().getRequest(); // 获取完整的原始请求URL(包含主机、路径、参数等) URI originalRequestUri = httpRequest.getURI(); String fullOriginalUrl = originalRequestUri.toString(); // 单独提取源主机 String originalHost = originalRequestUri.getHost(); // 单独提取请求路径 String originalPath = originalRequestUri.getPath(); // 这里可以加入你的业务逻辑,比如用这些信息构建链接 return ServerResponse.ok().bodyValue("原始请求URL: " + fullOriginalUrl); }
3. 手动解析代理头(无需全局Filter的场景)
如果你不想全局配置Filter,也可以在单个请求里手动解析代理头,用ForwardedHeadersAccessor工具类:
public Mono<ServerResponse> getIndex(ServerRequest request) { ServerHttpRequest httpRequest = request.exchange().getRequest(); ForwardedHeadersAccessor accessor = ForwardedHeadersAccessor.wrap(httpRequest); // 获取代理转发后的URI,如果没有代理头则返回null URI forwardedUri = accessor.getForwardedUri(); URI finalUri = forwardedUri != null ? forwardedUri : httpRequest.getURI(); String fullUrl = finalUri.toString(); String host = finalUri.getHost(); return ServerResponse.ok().bodyValue("最终请求URL: " + fullUrl); }
两种场景的适配说明
- 直接请求:不管用哪种方式,都会直接返回客户端请求的原始URL和主机信息
- 代理转发请求:
ForwardedHeaderFilter或ForwardedHeadersAccessor会自动读取X-Forwarded-*系列头,把请求信息修正为客户端最初发送的内容,不用你手动拼接头信息
内容的提问来源于stack exchange,提问作者Antoine
相关产品推荐
相关产品推荐

