springboot获取用户ip

springboot获取用户ip

简介:springboot,或者spring,通过HttpServletRequest获取请求者ip,通过 request.getRemoteAddr() 方法即可,但是该方法获取的不全是用户的ip地址,如果请求通过第三方转发或者重定向,获取的就不是需求的ip。

1. 获取请求源IP

之前在前后端分离项目中,前端更换https后,后端没有配置https,就通过nginx代理转发,将https请求转发到http,使得前端能正常访问后端。

然后在后端日志记录中,发现获取请求ip地址全变成nginx服务器的ip,然后查证后,是request.getRemoteAddr()方法的问题。遂将获取ip的代码更改为

    /**
     * request.getRemoteAddr() 配置Nginx转发后获取不到原来IP,试下这样获取IP
     */
    public String getIpAddress(HttpServletRequest request) throws UnknownHostException {
        String ip = request.getHeader("X-Forwarded-For");
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            // apache 代理添加的请求头
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            // weblogic 代理添加的请求头
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            // 某些代理服务器的请求头
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            // 某些代理服务器的请求头
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
            if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {
                //根据网卡取本机配置的IP
                InetAddress inet = InetAddress.getLocalHost();
                ip = inet.getHostAddress();
            }
        }
        if (ip.contains(",")) {
            ip = ip.split(",")[0];
        }
        return ip;
    }

2. 配置代理服务器nginx

像我通过nginx代理转发,需要在转发的配置中添加转发源的ip,配置如下

        location /api/ {
        	## 设置转发源IP,告诉目标服务经过了路由转发,可以不配置,但是建议配置,对后端获取源IP友好
          	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          	## 转发目的网址
            proxy_pass http://yourservername:8003/;
        }

然后重启nginx配置。

这样后端通过上面的getIpAddress()方法即可获取到源ip。

另外,这种方式只能获取合规的ip,如果请求者恶意伪装ip,那些通过其他技术手段更改请求ip的,还是无法获取到请求者真实ip

至此,全篇结束

你可能感兴趣的:(spring,boot,tcp/ip,后端)