四畳半神话大系

Spring Cloud 疑难杂症(3): docker swarm 环境下获取用户正确 IP

微服务中的业务服务基本上通过网关服务转发进来的。此时获取用户IP一般都是前一层网关服务的容器 IP 地址。
需要增加X-Forwarded-For配置,将用户真实 IP 层层传递进来

获取IP代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static String getClientIp(HttpServletRequest request){
Enumeration<String> headerNames = request.getHeaderNames();
StringBuffer header = new StringBuffer();
while (headerNames.hasMoreElements()){
String s = headerNames.nextElement();
header.append(s);
header.append("=");
header.append(request.getHeader(s));
header.append("|");
}
String ip = request.getHeader("x-forwarded-for");
if (ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if (ip != null && ip.length() > 15) {
if (ip.indexOf(",") > 0) {
ip = ip.substring(0, ip.indexOf(","));
}
}
return ip;
}

tomcat 服务器配置

1
2
3
4
5
6
7
# application.yml
server:
port: 8011
use-forward-headers: true
tomcat:
remote-ip-header: X-Real-IP
protocol-header: X-Forwarded-Proto

Nginx 配置

1
2
3
4
5
6
7
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}

专题:

本文发表于 2020-04-04,最后修改于 2020-04-04。

本站永久域名blog.amoyiki.com,也可搜索「 四畳半神话大系 」找到我。

期待关注我的 ,查看最近的文章和动态。


上一篇 « Spring Cloud 疑难杂症(2): docker swarm 环境下多网卡问题 下一篇 » Spring Cloud 疑难杂症(4): Feign 访问缓慢及调用出错

推荐阅读

Big Image