Spring获取URL信息

Spring获取URL信息

  • 背景
  • 原因
  • 解决
      • [Nginx 的 location 里补充标准转发头](#Nginx 的 location 里补充标准转发头)
      • [Spring Boot 配置中启用对转发头的支持](#Spring Boot 配置中启用对转发头的支持)

背景

使用oauth2对接三方统一认证

1、去三方系统登录、成功后回调自己的服务并携带三方认证码code

2、使用认证码获取token、进一步获取人员工号

3、通过工号匹配我方系统人员信息生成token

在第二步、获取token时使用代码获取当前请求的URL、我方Nginx收到了三方的认证回调为https、实际在程序中获取出来的地址是http。导致认证码获取三方系统token异常。

java 复制代码
   private String getDomainName() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        return request.getRequestURL().toString();
    }

原因

反向代理终止 TLS:客户端用 HTTPS 访问到 Nginx,Nginx与后端应用用 HTTP 通信。后端若不识别代理头,就会认为"自己收到的是 HTTP"

解决

Nginx 的 location 里补充标准转发头

代理透传"原始请求信息":Nginx通过 X-Forwarded-* 头把客户端的"原始协议、主机、端口、来源 IP"等信息告诉后端。关键头:

  • X-Forwarded-Proto :原始协议,通常为 https 或 http
  • X-Forwarded-Host :原始主机名(含域名,可能含端口)
  • X-Forwarded-Port :原始端口(如 443 / 80 )
  • X-Forwarded-For :原始客户端 IP 链(逗号分隔)
  • Host :把客户端的 Host 头传给后端,避免后端只看到内网目标主机、
bash 复制代码
 proxy_set_header X-Forwarded-Proto $scheme;
 proxy_set_header X-Forwarded-Port  $server_port;
 proxy_set_header X-Forwarded-Host  $host;
 proxy_set_header Host $host;

Spring Boot 配置中启用对转发头的支持

框架"采纳"这些头:应用容器或框架读取这些 X-Forwarded-* (或标准 Forwarded )头,把 HttpServletRequest 的"可见属性"改成客户端视角,从而 getScheme()/isSecure()/getServerName()/getServerPort()/getRequestURL() 都与外部一致

server.forward-headers-strategy=framework

  • Spring 注入 ForwardedHeaderFilter ,优先解析标准 Forwarded 头,若没有则解析 X-Forwarded-* 。
  • 过滤器包装 HttpServletRequest ,用头中的值覆盖 scheme / secure / serverName / serverPort 等,使后续代码拿到的是"客户端视角"的请求信息。
  • 受影响的方法包括: request.getScheme() 、 request.isSecure() 、 request.getServerName() 、 request.getServerPort() 、 ServletUriComponentsBuilder 构造的 URL 等。

server.forward-headers-strategy=native

  • 依赖容器原生支持。对于 Tomcat,Spring Boot 会配置 RemoteIpValve :
    • protocolHeader=x-forwarded-proto :把 X-Forwarded-Proto 采纳为 scheme / secure
    • remoteIpHeader=x-forwarded-for :采纳客户端 IP
    • portHeader=x-forwarded-port 、 hostHeader=x-forwarded-host :采纳端口和主机
  • Valve在容器层修改请求对象,应用代码"天然"拿到外部视角。

server.use-forward-headers=true (老版本):

  • 旧属性,作用类似"framework",在新版本被 server.forward-headers-strategy 取代。
相关推荐
爱笑的源码基地28 分钟前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
IT_陈寒37 分钟前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
段一凡-华北理工大学41 分钟前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
码事漫谈1 小时前
1999年的电商前夜和2026年的AI前夜 历史押韵但从不重复
后端
Conan在掘金2 小时前
鸿蒙报错速查:arkts-strict-typing Property does not exist on type 'object',object 装函数就炸,根因 + 真解法
后端
颜酱2 小时前
01 | 骨架搭建:FastAPI + Vue 跑通第一个 SSE 流式问答
前端·人工智能·后端
程序员cxuan3 小时前
Grok Build 被众人唾骂,结果老马把它开源了
人工智能·后端·程序员
莫逸风3 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
从零开始的代码生活_3 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
Conan在掘金3 小时前
�鸿蒙报错速查:Cannot find name 'require',禁用 require(),根因 + 真解法
后端