通过RTCPeerConnection接口来获取用户的IP地址

2024-09-07 21:18

本文主要是介绍通过RTCPeerConnection接口来获取用户的IP地址,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该方法在chrome78以上不再适用,想要获取真实IP可以通过后端获取,如果中间有nginx或者其他负载均衡会对真实IP隐藏的话,可以配置http的x-forwarded-for参数,具体请参考相关文章

RTCPeerConnection接口相当于一个由本地计算机到远端的WebRTC连接,接口提供了创建,保持,关闭连接的方法。
RTCPeerConnection.onicecandidate: 收到 icecandidate 事件时的事件处理器,当一个RTCDataChannel被添加到连接时,这个事件被触发。
RTCPeerConnection.createOffer(): 生成一个offer,它是一个带有特定的配置信息寻找远端匹配机器(peer)的请求,这个方法的前两个参数分别是方法调用成功以及失败的回调函数,可选的第三个参数是用户对视频流以及音频流的定制选项。
RTCPeerConnection.createDataChannel(): 建立一条数据通道,用于发送非音频视频消息
rtc.setLocalDescription(): 返回一个promise对象

var obj = {}function getIPAddress(callback) {var RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;if (RTCPeerConnection) {var rtc = new RTCPeerConnection({ iceServsers: [] });rtc.createDataChannel('', { reliable: false }); // 建立一条数据通道, 用于发送非音频视频消息rtc.onicecandidate = function (evt) { // 收到icecandidate事件时的事件处理器,当一个RTCDataChannel被添加到连接时,这个事件被触发if (evt.candidate) {grepSDP('a=' + evt.candidate.candidate);}};var addrs = Object.create(null);addrs['0.0.0.0'] = false;var grepSDP = function (sdp) {sdp.split('\r\n').forEach(function (line, index, arr) {if (~line.indexOf('a=candidate')) {var parts = line.split(' '),addr = parts[4],type = parts[7];if (type === 'host') {updateDisplay(addr);};} else if (~line.indexOf('c=')) {var parts = line.split(' '),addr = parts[2];updateDisplay(addr);}});};var updateDisplay = function (newAddr) {if (newAddr in addrs) {return;} else {addrs[newAddr] = true;}var displayAddrs = Object.keys(addrs).filter(function (k) {return addrs[k];});for (var i = 0; i < displayAddrs.length; i++) {if (displayAddrs[i].length > 16) {displayAddrs.splice(i, 1);i--;}}callback(displayAddrs[0]);};rtc.createOffer(function (offerDesc) { // 生成一个offer,带有特定的配置信息,寻找远端匹配机器的请求grepSDP(offerDesc.sdp);rtc.setLocalDescription(offerDesc);}, function (e) {throw new Error(e);});}};getIPAddress(function (data) {obj.ip = data;document.write(obj.ip);});

getIPAddress是异步函数,可以封装成promise,通过then的方式来得到返回数据

这篇关于通过RTCPeerConnection接口来获取用户的IP地址的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146181

相关文章

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置