东方通web默认配置坑-无法获取xff
问题现象
东方通war服务部署后,通过nginx-->ingress模式访问出现 https与http混淆请求,浏览器报错:
location /airedo2 {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
# 代理到上游服务
proxy_pass http://ingress;
}
已阻止加载混合活动内容"http://xxx.com/airedo2/resources/js/common/jsutil.js"

于是乎修改为通过nginx-->k8s的ip+端口模式访问依旧出现 https与http混淆请求拦截!
location /airedo2 {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
# 代理到上游服务
proxy_pass http://10.202.17.4:31090;
}
问题分析
1. 混合内容(Mixed Content)问题原理
- 用户通过 HTTPS 访问:
https://xxx.com/airedo2 - Nginx 代理到后端服务:
http://10.202.17.4:31090(HTTP 协议) - 后端 JSP 使用
request.getScheme()构建资源 URL - 由于后端接收到的是 HTTP 请求,生成的资源链接是
http://开头 - 浏览器安全策略:HTTPS 页面不允许加载 HTTP 资源 → 报错
2. 排查过程
2.1 检查 JSP 代码
查看 src/main/webapp/WEB-INF/views/commons/taglibs.jsp:
<c:set var="ctx" value="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}"/>

问题:pageContext.request.scheme 返回的是 http 而不是 https
2.2 检查 Nginx 配置
Nginx 已经正确传递了转发头部:
proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议(https)
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Port $server_port;
2.3 检查应用代码
搜索代码中是否有处理 X-Forwarded-* 头部的逻辑:
# 搜索 Filter 或 Interceptor
grep -r "X-Forwarded-Proto" src/
grep -r "RemoteIpFilter" src/
结果:没有任何代码处理这些头部!
2.4 检查 TongWeb 配置
查看 tongweb.xml 配置文件:
<security XForwardedFor="false" ...>
找到根本原因: TongWeb 的 XFF(X-Forwarded-For)功能默认是关闭的!
通过查看手册 TongWeb V8.0安全加固手册.pdf 确认:

3. 问题根因
Java Servlet 的 request.getScheme() 方法默认不会读取 X-Forwarded-Proto 头部!
它只返回直接连接的协议(Nginx 到后端的 HTTP),而不会自动识别 Nginx 传递的转发头部。
TongWeb 虽然支持通过配置读取这些头部,但默认是关闭的(XForwardedFor="false"),导致:
– Nginx 传了 X-Forwarded-Proto: https
– 但 TongWeb 不读取这个头部
– request.getScheme() 仍然返回 http
– JSP 生成的 URL 都是 http:// 开头
解决方案
修改 TongWeb 配置
在 tongweb.xml 配置文件中启用 X-Forwarded-* 头部支持:
<!-- 修改这里:启用 X-Forwarded-* 头部支持 -->
<security XForwardedFor="true"
protocolHeader="X-Forwarded-Proto"
hostHeader=""
portHeader=""
allowReferer=""
denyReferer=""
enableCrawlerSessionManager="false"
filterRemoteAddr="false"
filterRemoteHost="false"
filterTime="false"
filterTimeBegin="0"
filterTimeEnd="24"
rejectSystemExit="false"
repeat=""/>
关键参数说明:
| 参数 | 值 | 说明 |
|---|---|---|
XForwardedFor |
true |
启用 X-Forwarded-* 头部解析功能 |
protocolHeader |
X-Forwarded-Proto |
从这个头部读取协议信息(http/https),这是核心配置 |
hostHeader |
"" |
留空表示不覆盖主机名,使用标准 Host 头部 |
portHeader |
"" |
留空表示根据协议自动判断端口(http=80, https=443) |
为什么 hostHeader 和 portHeader 可以留空?
- Nginx 已经通过
proxy_set_header Host $http_host;传递了正确的 Host 头部 - TongWeb 会从标准的
Host头部读取主机名,无需额外配置 - 端口会根据
protocolHeader自动判断(https 默认 443)
总结
这个问题的本质是:
1. 错误认知:以为 Nginx 传了头部,后端就能自动获取
2. 正确理解:需要应用服务器配置才能读取转发头部
3. 解决方法:启用 TongWeb 的 XForwardedFor 功能
记住: 东方通 TongWeb 默认不读取 X-Forwarded-* 头部,必须显式配置
XForwardedFor="true"和protocolHeader="X-Forwarded-Proto"!