欢迎来到我的“今天我学到了”系列的第一部分!通过这些帖子,我将分享我在作为算法工程师的工作中获得的实际见解,深入研究我为解决现实世界挑战而实施的技术。我希望这些课程也能为您的项目带来价值。
要点
- 控制多个选项卡实例:防止用户打开同一 Web 应用程序的多个实例,这可能会耗尽资源并可能导致服务器崩溃。
- 使用 JavaScript 获取用户 IP 地址:了解为什么由于安全限制和探索解决方法,在 JavaScript 中获取用户的 IP 地址是一个挑战。
为了说明这一点,我将介绍我所从事的一个涉及人脸识别技术的项目,特别是简化处理和维护跨用户性能所需的步骤。
项目概述:构建人脸识别 Web 应用程序
在此示例中,任务是创建一个可通过网络浏览器访问的人脸识别应用程序(签入签出系统)。该应用程序需要:
- 页面加载时自动启动。
- 捕获用户的脸部,检查“活跃度”(确认其是真人),然后将图像传输到服务器进行识别。
- 在浏览器上显示识别结果。
该应用程序设计有两个主要组件:
- 客户端处理:包括人脸检测和活体检测,在浏览器中处理。
- 服务器端处理:负责人脸识别,利用服务器资源进行身份匹配。
为了简单起见,假设客户端在将其发送到服务器之前检测并验证脸部,服务器返回结果,浏览器显示它们。
问题:防止多个选项卡
想象一下一个典型的用户 Alex,他最近开始使用新的面部识别网络应用程序来上班和下班。一天早上,亚历克斯决定在几个浏览器选项卡中打开该应用程序,认为他可以通过同时在多个选项卡中测试它来加快签入速度。
几乎立刻,事情就开始走下坡路。加载每个选项卡时,它会独立初始化应用程序的面部检测和验证过程。亚历克斯注意到他的计算机速度急剧下降,最终,浏览器开始滞后。在幕后,这些多个选项卡均使用资源来处理 Alex 的脸部,这对他的设备性能造成了巨大损失。
但问题并没有就此结束。由于每个选项卡向服务器发送单独的识别请求,应用程序的服务器负载激增,导致其他用户同时登录出现延迟。服务器因重复请求而不堪重负,几乎无法跟上,导致延迟和错过签到。
为了让事情变得更加混乱,每个选项卡都显示不同的、不一致的登录状态。 Alex 很快意识到,在多个选项卡中打开应用程序给他带来了不必要的麻烦,并给整个公司带来了潜在的问题。
为了确保无缝功能并避免对客户端和服务器资源造成不必要的压力,我们需要防止用户使用应用程序打开多个选项卡
目标是限制用户在浏览器中一次打开多个应用程序实例,主要是通过检测同一应用程序的其他选项卡何时已打开。解决方法如下:
if (localStorage.getItem('isAppRunning') === 'true') { alert("The application is already open in another tab. Please close this tab."); } else { // Set a flag in localStorage to indicate the app is running localStorage.setItem('isAppRunning', 'true'); // Add an event listener to clear the flag when the tab is closed window.addEventListener('beforeunload', () => { localStorage.removeItem('isAppRunning'); }); // Main function to load models and start video if the app is not running in another tab (async function main() { try { const config = await loadConfig(); // Load models concurrently const [tinyFaceDetector, fasnet, phoneDetect] = await Promise.all([ loadTinyFaceDetector(), loadFasnet(config), loadPhoneDetect(config), ]); Object.assign(window, { fasnet, phoneDetect, config }); startVideo(); } catch (err) { console.error('Initialization failed:', err); } })(); }
问题:获取用户IP
在我们的人脸识别系统中,要求已发展为仅允许授权的部门特定访问。例如,如果人员 A 属于部门 A,则他们应该只能在部门 A 网络中的设备上签入或签出,而不能在部门 B 或任何其他部门的设备上签入或签出。由于这些计算机是通过局域网 (LAN) 连接的,因此我们需要一种方法来根据设备的 IP 地址来识别和限制访问
当我在网上搜索时,我得到了一些有关获取IP地址的信息。但他们有一些问题
function user_location() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { console.log( this.responseText); } }; xhttp.open("GET", "//api.ipify.org?format=json", true); xhttp.send(); }
该函数成功获取用户的公网IP地址;但是,它不提供部门特定访问控制所需的内部 LAN IP 地址。此外,它还容易受到 VPN 或防火墙的屏蔽。
或者也许是这个
Firefox 和 Chrome 已经实现了 WebRTC,允许向 STUN 服务器发出请求,该服务器将返回用户的本地和公共 IP 地址
但我不想在我的应用程序中添加更多包。这种复杂性,再加上潜在的跨浏览器不一致,使其不太理想。
然后我发现了这篇文章
使用浏览器中运行的 JavaScript 直接检索客户端 IP 地址并不简单。这是因为 JavaScript 无法访问暴露 IP 地址的网络层。此外,出于安全原因,浏览器对 JavaScript 环境进行沙箱处理,阻止其访问某些系统级信息,包括客户端的 IP 地址。
事实证明,仅使用 JavaScript 检索 IP 地址是不可行的。不过,有一个简单的解决方案:在服务器上创建 API 端点来获取用户的 IP 地址。
if (localStorage.getItem('isAppRunning') === 'true') { alert("The application is already open in another tab. Please close this tab."); } else { // Set a flag in localStorage to indicate the app is running localStorage.setItem('isAppRunning', 'true'); // Add an event listener to clear the flag when the tab is closed window.addEventListener('beforeunload', () => { localStorage.removeItem('isAppRunning'); }); // Main function to load models and start video if the app is not running in another tab (async function main() { try { const config = await loadConfig(); // Load models concurrently const [tinyFaceDetector, fasnet, phoneDetect] = await Promise.all([ loadTinyFaceDetector(), loadFasnet(config), loadPhoneDetect(config), ]); Object.assign(window, { fasnet, phoneDetect, config }); startVideo(); } catch (err) { console.error('Initialization failed:', err); } })(); }
当客户端发出请求时,Flask 会自动使用各种标头和连接详细信息填充请求对象。
首先,代码使用 client_ip = request.headers.get('X-Forwarded-For') 检查 X-Forwarded-For 标头。
用途:此标头通常由代理或负载均衡器设置,以保留原始客户端 IP 地址。如果请求通过代理或负载均衡器传递,则客户端的实际 IP 地址应出现在此标头中。
如果找到 X-Forwarded-For 标头,client_ip 将设置为其值。
如果 X-Forwarded-For 标头丢失(例如,如果客户端在没有代理的情况下直接连接),则代码使用 request.remote_addr 直接从客户端获取 IP 地址。
概括
在这篇文章中,我分享了我在开发基于网络的人脸识别应用程序时应对现实世界挑战的经验。以下是我们解决的两个关键问题:
防止多个选项卡实例:为了阻止用户在多个浏览器选项卡中打开应用程序,我们使用 localStorage 来跟踪应用程序是否已打开。这可以防止冗余的人脸检测过程对客户端和服务器资源造成压力。
检索用户 IP 地址:由于安全限制,JavaScript 无法直接访问设备的 LAN IP,因此我们在服务器上设置 API 端点以从请求标头中获取 IP。这种方法确保仅对授权设备进行部门特定的访问控制。
以上是TIL:在 Javascript 中阻止选项卡并获取 IP的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

WebStorm Mac版
好用的JavaScript开发工具

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

记事本++7.3.1
好用且免费的代码编辑器