1.获取用户ip方法如下
public static String getIpAddr(HttpServletRequest request)
{
if (request == null)
{
return "unknown";
}
String ip = request.getHeader("x-forwarded-for");
log.info("x-forwarded-for ip={}", ip);
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("Proxy-Client-IP");
log.info("Proxy-Client-IP ip={}", ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("X-Forwarded-For");
log.info("X-Forwarded-For ip={}", ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("WL-Proxy-Client-IP");
log.info("WL-Proxy-Client-IP ip={}", ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("X-Real-IP");
log.info("X-Real-IP ip={}", ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getRemoteAddr();
log.info("getRemoteAddr ip={}", ip);
}
return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip);
}
public static String getMultistageReverseProxyIp(String ip)
{
// 多级反向代理检测
if (ip != null && ip.indexOf(",") > 0)
{
final String[] ips = ip.trim().split(",");
for (String subIp : ips)
{
if (false == isUnknown(subIp))
{
ip = subIp;
break;
}
}
}
return StringUtils.substring(ip, 0, 255);
}
2.打印内容如下:
c.t.c.u.ip.IpUtils - [getIpAddr,49] - x-forwarded-for ip=null
c.t.c.u.ip.IpUtils - [getIpAddr,55] - Proxy-Client-IP ip=null
c.t.c.u.ip.IpUtils - [getIpAddr,60] - X-Forwarded-For ip=null
c.t.c.u.ip.IpUtils - [getIpAddr,65] - WL-Proxy-Client-IP ip=null
c.t.c.u.ip.IpUtils - [getIpAddr,70] - X-Real-IP ip=null
c.t.c.u.ip.IpUtils - [getIpAddr,76] - getRemoteAddr ip=172.54.xx.xx
发现只能拿到nginx代理服务器的内网IP
3.解决办法
在Nginx中设置正确的头信息:
server {
listen 80;
server_name example.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://backend;
}
}

189

被折叠的 条评论
为什么被折叠?



