Willkommen zum ersten Teil meiner „Today I Learned“-Reihe! In diesen Beiträgen teile ich praktische Erkenntnisse, die ich während meiner Arbeit als Algorithmus-Ingenieur gewonnen habe, und vertiefe mich in die Techniken, die ich implementiert habe, um reale Herausforderungen zu bewältigen. Ich hoffe, dass diese Lektionen auch für Ihre Projekte von Nutzen sind.
Wichtige Erkenntnisse
- Kontrolle mehrerer Tab-Instanzen: Verhindert, dass Benutzer mehrere Instanzen derselben Webanwendung öffnen, was Ressourcen belasten und möglicherweise Server zum Absturz bringen kann.
- Erhalten der IP-Adresse eines Benutzers mit JavaScript: Verstehen, warum das Erhalten der IP-Adresse eines Benutzers in JavaScript aufgrund von Sicherheitsbeschränkungen und der Suche nach Problemumgehungen eine Herausforderung darstellt.
Zur Veranschaulichung werde ich ein Projekt durchgehen, an dem ich mit Gesichtserkennungstechnologie gearbeitet habe – insbesondere die Schritte, die erforderlich sind, um die Verarbeitung zu optimieren und die Leistung aller Benutzer aufrechtzuerhalten.
Projektübersicht: Erstellen einer Webanwendung zur Gesichtserkennung
In diesem Beispiel bestand die Aufgabe darin, eine Gesichtserkennungsanwendung (Check-in-Check-out-System) zu erstellen, auf die über einen Webbrowser zugegriffen werden kann. Die Anwendung musste:
- Automatisch starten, wenn die Seite geladen wird.
- Erfassen Sie das Gesicht des Benutzers, überprüfen Sie es auf „Lebendigkeit“ (um zu bestätigen, dass es sich um eine echte Person handelt) und übertragen Sie das Bild dann zur Erkennung an einen Server.
- Zeigen Sie das Erkennungsergebnis im Browser an.
Die Anwendung besteht aus zwei Hauptkomponenten:
- Clientseitige Verarbeitung: Beinhaltet Gesichtserkennung und Liveness-Erkennung, verarbeitet im Browser.
- Serverseitige Verarbeitung: Verantwortlich für die Gesichtserkennung, Nutzung von Serverressourcen für den Identitätsabgleich.
Stellen Sie sich der Einfachheit halber vor, dass der Client ein Gesicht erkennt und verifiziert, bevor er es an den Server sendet, wo der Server Ergebnisse zurückgibt und der Browser sie anzeigt.
Das Problem: Mehrere Tabs verhindern
Stellen Sie sich einen typischen Benutzer vor, Alex, der vor kurzem damit begonnen hat, eine neue Web-App mit Gesichtserkennung zum Ein- und Ausstempeln zu verwenden. Eines Morgens beschloss Alex, die App in einigen Browser-Tabs zu öffnen, weil er dachte, er könne das Einchecken beschleunigen, indem er sie in mehreren Tabs gleichzeitig teste.
Fast sofort ging es bergab. Beim Laden jeder Registerkarte wurden die Gesichtserkennungs- und Verifizierungsprozesse der App unabhängig initialisiert. Alex bemerkte, dass sein Computer drastisch langsamer wurde und der Browser schließlich langsamer wurde. Hinter den Kulissen verbrauchten diese verschiedenen Tabs jeweils Ressourcen, um Alex‘ Gesicht zu verarbeiten, was die Leistung seines Geräts stark beeinträchtigte.
Aber damit war das Problem noch nicht erledigt. Da jeder Tab separate Erkennungsanfragen an den Server sendete, stieg die Serverlast der App an, was zu Verzögerungen bei der gleichzeitigen Anmeldung anderer Benutzer führte. Der mit doppelten Anfragen überlastete Server konnte kaum mithalten, was zu Verzögerungen und verpassten Check-ins führte.
Um die Sache noch verwirrender zu machen, wurde auf jeder Registerkarte ein anderer, inkonsistenter Anmeldestatus angezeigt. Alex wurde schnell klar, dass das Öffnen der App in mehreren Tabs ihm unnötige Kopfschmerzen und potenzielle Probleme für das gesamte Unternehmen bereitet hatte.
Um eine reibungslose Funktionalität zu gewährleisten und eine unnötige Belastung der Client- und Serverressourcen zu vermeiden, mussten wir verhindern, dass Benutzer mehrere Registerkarten mit der Anwendung öffnen
Das Ziel bestand darin, Benutzer daran zu hindern, mehr als eine Instanz der App gleichzeitig in ihrem Browser zu öffnen, indem vor allem erkannt wurde, wann andere Tabs mit derselben App bereits geöffnet sind. So gehen Sie vor:
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); } })(); }
Das Problem: Benutzer-IP abrufen
In unserem Gesichtserkennungssystem hat sich die Anforderung entwickelt, nur autorisierten abteilungsspezifischen Zugriff zu ermöglichen. Wenn Person A beispielsweise zu Abteilung A gehört, sollte sie sich nur auf Geräten im Netzwerk von Abteilung A ein- oder auschecken können, nicht jedoch in Abteilung B oder einer anderen Abteilung. Da diese Computer über ein lokales Netzwerk (LAN) verbunden sind, benötigen wir eine Möglichkeit, den Zugriff anhand der IP-Adresse des Geräts zu identifizieren und einzuschränken
Als ich online gesucht habe, habe ich einige Informationen zum Abrufen der IP-Adresse erhalten. Aber sie haben ein paar Probleme
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(); }
Diese Funktion ruft erfolgreich die öffentliche IP-Adresse des Benutzers ab; Es stellt jedoch nicht die interne LAN-IP-Adresse bereit, die für die abteilungsspezifische Zugriffskontrolle erforderlich ist. Darüber hinaus ist es anfällig für die Maskierung durch VPNs oder Firewalls.
oder vielleicht dieses
Firefox und Chrome haben WebRTC implementiert, das es ermöglicht, Anfragen an STUN-Server zu stellen, die die lokalen und öffentlichen IP-Adressen für den Benutzer zurückgeben
Aber ich möchte meiner App keine weiteren Pakete hinzufügen. Diese Komplexität, kombiniert mit möglichen Inkonsistenzen zwischen verschiedenen Browsern, macht es weniger wünschenswert.
Dann habe ich diesen Beitrag gefunden
Das direkte Abrufen einer Client-IP-Adresse mit im Browser ausgeführtem JavaScript ist nicht einfach. Dies liegt daran, dass JavaScript keinen Zugriff auf die Netzwerkschicht hat, auf der IP-Adressen offengelegt werden. Darüber hinaus blockieren Browser aus Sicherheitsgründen die JavaScript-Umgebung und verhindern so den Zugriff auf bestimmte Informationen auf Systemebene, einschließlich der IP-Adresse des Clients.
Es stellt sich heraus, dass das Abrufen der IP-Adresse allein mit JavaScript nicht möglich ist. Es gibt jedoch eine einfache Lösung: Erstellen eines API-Endpunkts auf dem Server, um die IP-Adresse des Benutzers zu erhalten.
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); } })(); }
Wenn ein Client eine Anfrage stellt, füllt Flask das Anfrageobjekt automatisch mit verschiedenen Headern und Verbindungsdetails.
Zuerst überprüft der Code den X-Forwarded-For-Header mit client_ip = request.headers.get('X-Forwarded-For').
Zweck: Dieser Header wird üblicherweise von Proxys oder Load Balancern festgelegt, um die ursprüngliche Client-IP-Adresse beizubehalten. Wenn die Anfrage über einen Proxy oder Load Balancer geleitet wurde, sollte die tatsächliche IP-Adresse des Clients in diesem Header erscheinen.
Wenn der X-Forwarded-For-Header gefunden wird, wird client_ip auf seinen Wert gesetzt.
Wenn der X-Forwarded-For-Header fehlt (z. B. wenn der Client eine direkte Verbindung ohne Proxy herstellt), verwendet der Code request.remote_addr, um die IP-Adresse direkt vom Client abzurufen.
Zusammenfassung
In diesem Beitrag teile ich meine Erfahrungen bei der Bewältigung realer Herausforderungen bei der Entwicklung einer webbasierten Gesichtserkennungs-App. Hier sind zwei Hauptprobleme, die wir gelöst haben:
Verhindern mehrerer Tab-Instanzen: Um zu verhindern, dass Benutzer die App in mehreren Browser-Tabs öffnen, verwenden wir localStorage, um zu verfolgen, ob die App bereits geöffnet ist. Dies verhindert redundante Gesichtserkennungsprozesse, die sowohl Client- als auch Serverressourcen belasten.
Benutzer-IP-Adresse abrufen: Da JavaScript aus Sicherheitsgründen nicht direkt auf die LAN-IP eines Geräts zugreifen kann, richten wir einen API-Endpunkt auf dem Server ein, um die IP aus Anforderungsheadern abzurufen. Dieser Ansatz gewährleistet eine abteilungsspezifische Zugriffskontrolle nur für autorisierte Geräte.
Das obige ist der detaillierte Inhalt vonTIL: Tabs blockieren und IP in Javascript abrufen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Es ist für Entwickler wichtig, zu verstehen, wie die JavaScript -Engine intern funktioniert, da sie effizientere Code schreibt und Leistungs Engpässe und Optimierungsstrategien verstehen kann. 1) Der Workflow der Engine umfasst drei Phasen: Parsen, Kompilieren und Ausführung; 2) Während des Ausführungsprozesses führt die Engine dynamische Optimierung durch, wie z. B. Inline -Cache und versteckte Klassen. 3) Zu Best Practices gehören die Vermeidung globaler Variablen, die Optimierung von Schleifen, die Verwendung von const und lass und die Vermeidung übermäßiger Verwendung von Schließungen.

Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

Python und JavaScript haben ihre eigenen Vor- und Nachteile in Bezug auf Gemeinschaft, Bibliotheken und Ressourcen. 1) Die Python-Community ist freundlich und für Anfänger geeignet, aber die Front-End-Entwicklungsressourcen sind nicht so reich wie JavaScript. 2) Python ist leistungsstark in Bibliotheken für Datenwissenschaft und maschinelles Lernen, während JavaScript in Bibliotheken und Front-End-Entwicklungsbibliotheken und Frameworks besser ist. 3) Beide haben reichhaltige Lernressourcen, aber Python eignet sich zum Beginn der offiziellen Dokumente, während JavaScript mit Mdnwebdocs besser ist. Die Wahl sollte auf Projektbedürfnissen und persönlichen Interessen beruhen.

Die Verschiebung von C/C zu JavaScript erfordert die Anpassung an dynamische Typisierung, Müllsammlung und asynchrone Programmierung. 1) C/C ist eine statisch typisierte Sprache, die eine manuelle Speicherverwaltung erfordert, während JavaScript dynamisch eingegeben und die Müllsammlung automatisch verarbeitet wird. 2) C/C muss in den Maschinencode kompiliert werden, während JavaScript eine interpretierte Sprache ist. 3) JavaScript führt Konzepte wie Verschlüsse, Prototypketten und Versprechen ein, die die Flexibilität und asynchrone Programmierfunktionen verbessern.

Unterschiedliche JavaScript -Motoren haben unterschiedliche Auswirkungen beim Analysieren und Ausführen von JavaScript -Code, da sich die Implementierungsprinzipien und Optimierungsstrategien jeder Engine unterscheiden. 1. Lexikalanalyse: Quellcode in die lexikalische Einheit umwandeln. 2. Grammatikanalyse: Erzeugen Sie einen abstrakten Syntaxbaum. 3. Optimierung und Kompilierung: Generieren Sie den Maschinencode über den JIT -Compiler. 4. Führen Sie aus: Führen Sie den Maschinencode aus. V8 Engine optimiert durch sofortige Kompilierung und versteckte Klasse.

Zu den Anwendungen von JavaScript in der realen Welt gehören die serverseitige Programmierung, die Entwicklung mobiler Anwendungen und das Internet der Dinge. Die serverseitige Programmierung wird über node.js realisiert, die für die hohe gleichzeitige Anfrageverarbeitung geeignet sind. 2. Die Entwicklung der mobilen Anwendungen erfolgt durch reaktnative und unterstützt die plattformübergreifende Bereitstellung. 3.. Wird für die Steuerung von IoT-Geräten über die Johnny-Five-Bibliothek verwendet, geeignet für Hardware-Interaktion.

Ich habe eine funktionale SaaS-Anwendung mit mehreren Mandanten (eine EdTech-App) mit Ihrem täglichen Tech-Tool erstellt und Sie können dasselbe tun. Was ist eine SaaS-Anwendung mit mehreren Mietern? Mit Multi-Tenant-SaaS-Anwendungen können Sie mehrere Kunden aus einem Sing bedienen

Dieser Artikel zeigt die Frontend -Integration mit einem Backend, das durch die Genehmigung gesichert ist und eine funktionale edtech SaaS -Anwendung unter Verwendung von Next.js. erstellt. Die Frontend erfasst Benutzerberechtigungen zur Steuerung der UI-Sichtbarkeit und stellt sicher, dass API-Anfragen die Rollenbasis einhalten


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

Sicherer Prüfungsbrowser
Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

WebStorm-Mac-Version
Nützliche JavaScript-Entwicklungstools

mPDF
mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),