首頁 web前端 js教程 TIL:在 Javascript 中封鎖選項卡並取得 IP

TIL:在 Javascript 中封鎖選項卡並取得 IP

Oct 31, 2024 pm 07:03 PM

歡迎來到我的「今天我學到了」系列的第一部分!透過這些帖子,我將分享我在作為演算法工程師的工作中獲得的實際見解,深入研究我為解決現實世界挑戰而實施的技術。我希望這些課程也能為您的專案帶來價值。

重點

  • 控制多個標籤實例:防止使用者開啟相同 Web 應用程式的多個實例,這可能會耗盡資源並可能導致伺服器崩潰。
  • 使用 JavaScript 取得使用者 IP 位址:了解為什麼由於安全限制和探索解決方法,在 JavaScript 中取得使用者的 IP 位址是一個挑戰。

為了說明這一點,我將介紹我所從事的一個涉及人臉辨識技術的項目,特別是簡化處理和維護跨使用者效能所需的步驟。

專案概述:建立人臉辨識 Web 應用程式

TIL: Block tabs and Get IP in Javascript

在此範例中,任務是建立一個可透過網頁瀏覽器存取的人臉辨識應用程式(簽入簽出系統)。該應用程式需要:

  1. 頁面載入時自動啟動。
  2. 捕捉使用者的臉部,檢查「活躍度」(確認其是真人),然後將影像傳輸到伺服器進行識別。
  3. 在瀏覽器上顯示辨識結果。

該應用程式設計有兩個主要組件:

  • 客戶端處理:包括人臉偵測和活體偵測,在瀏覽器中處理。
  • 伺服器端處理:負責人臉識別,利用伺服器資源進行身分匹配。

為了簡單起見,假設客戶端在將其發送到伺服器之前檢測並驗證臉部,伺服器傳回結果,瀏覽器顯示它們。

問題:防止多個選項卡

TIL: Block tabs and Get IP in Javascript

想像一下典型的使用者 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 位址來識別和限制存取

TIL: Block tabs and Get IP in Javascript

當我在網路上搜尋時,我得到了一些有關獲取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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript:探索網絡語言的多功能性 JavaScript:探索網絡語言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

如何使用Next.js(前端集成)構建多租戶SaaS應用程序 如何使用Next.js(前端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

使用Next.js(後端集成)構建多租戶SaaS應用程序 使用Next.js(後端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

See all articles