获取请求用户的真实 IP(兼容反向代理)

我们经常会遇到获取用户真实请求的 IP 地址的需求,但是如果后端服务器进行了反向代理,我们就需要做一下特殊处理才能获取用户的真实 IP。

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class IpUtils {

    public static String getRealIp(HttpServletRequest request) {
        // 如果用户请求经过了反向代理服务器,那么需要通过 x-forwarded-for 的请求头获取真实 IP
        String forwardedAddr = request.getHeader("x-forwarded-for");
        if (StringUtils.isNotBlank(forwardedAddr)) {
            if (forwardedAddr.contains(",")) {
                return forwardedAddr.substring(0, forwardedAddr.indexOf(","));
            }
            return forwardedAddr;
        }
        return request.getRemoteAddr();
    }
}