2014-10-28 6 views
6

Unsere Webanwendung verfügt über eine Schaltfläche, die Daten an einen Server im lokalen Netzwerk senden soll, der wiederum etwas auf einen Drucker druckt.Wie kann eine Webseite eine Nachricht an das lokale Netzwerk senden?

Bisher war es einfach: Die Schaltfläche löste eine AJAX POST-Anforderung an http://printerserver/print.php mit einem Token, diese Seite mit der Webanwendung verbunden, um das Token zu überprüfen und die Daten zu drucken und dann zu drucken.

Allerdings liefern wir jetzt unsere Webanwendung über HTTPs (und ich würde dafür lieber nicht zu HTTP zurückkehren) und neuere Versionen von Chrome und Firefox machen die Anfrage nicht mehr an die HTTP-Adresse, sie tun es nicht. t senden Sie sogar die Anfrage, um CORS-Header zu überprüfen.

Nun, was ist eine moderne Alternative zum Cross-Protokoll XHR? Haben Websockets das gleiche Problem? (Eine Google-Suche hat nicht deutlich gemacht, was hier aktuell ist.) Kann ich bereits TCP-Sockets verwenden? Ich würde auch lieber nicht zu GET-Anfragen wechseln, da die Aktion nicht idempotent ist und praktische Auswirkungen auf das Preloading und Caching haben könnte.

Ich kann die Anwendung auf dem Printer in irgendeiner Weise ändern (so konnte ich es mit NodeJS oder etwas ersetzen), aber ich kann der Benutzer Browser nicht ändern (ein selbst signiertes Zertifikat für Printer zum Beispiel vertrauen).

+0

Nur ein Gedanke, aber haben Sie versucht, mit CURL Ihre Anfrage zu stellen? Da CURL eine eigene Sitzung erstellt, sollte es nicht davon beeinflusst werden, wie sich der Browser verhält. –

+1

Ich dachte, das wäre klar aus der Frage: Maschine _printerserver_ und Browser des Benutzers sind in einem Netzwerk, der Webserver ist im Internet. – AndreKR

+0

Wenn ich es richtig verstehe, versuchen Sie "http: //printerserver/print.php" von einer HTTPS-Website aufzurufen. Versuchen Sie, den Server "http: //printerserver/print.php" an Port 443 auszuführen - um HTTPS zu unterstützen, also werden Ihre Anrufe auf dem gleichen Protokoll sein. –

Antwort

1

Sie können die Druckanforderungen auf dem Webserver in einer Warteschlange speichern und veranlassen, dass der Druckserver regelmäßig nach Druckanforderungen fragt.

Wenn das nicht möglich ist, würde ich einen Tunnel oder VPN zwischen dem Webserver und Printserver-Netzwerken einrichten. Auf diese Weise können Sie den Druckauftrag vom Webserver auf der Serverseite statt vom Client ausführen. Wenn Sie curl verwenden, gibt es Flags, um ungültige SSL-Zertifikate usw. zu ignorieren (ich vermute immer noch, dass es schöner ist, eine Warteschlange einzuführen, damit die Druckanforderungen nicht blockiert werden).

Wenn der Webserver eine SSH-Verbindung zu einer Netzwerkverbindung herstellen kann, auf der sich der Printserver befindet, könnten Sie Folgendes tun: ssh params user @ host einige curl-Befehle hier.

Dritte Option Ich denke, wenn Printserver kann zum Beispiel eine Subdomäne der Webserver-Domäne binden, wie: print.somedomain.com, können Sie in der Lage sein, es durch das Somedomain.com-Zertifikat, IIRC Sie vertraut müssen eine CSR (Certificate Signing Request) vom printserver-Zertifikat erstellen und mit dem somedomain.com-Zertifikat signieren. Vielleicht muss es nicht einmal eine Subdomain dafür sein, aber vielleicht ist das eine Voraussetzung für den Browser, um es clientseitig zu machen.

+0

Ich speichere diese Anfragen bereits und der Druckerserver verbindet sich bereits mit dem Webserver, um seine Daten zu erhalten. Ich brauche nur eine Möglichkeit für den Browser, dem Drucker zu sagen, dass er es tun soll, so dass das Drucken ein paar Sekunden nach dem Klick erfolgt. Ihr letzter Absatz scheint interessant, aber ist zu vage für mich zu verstehen. – AndreKR

+0

Kann der Printserver nicht selbst entscheiden, wann er drucken soll? Wenn Sie alles, was auf dem Webserver erledigt werden muss, speichern, überprüft der printserver jede X Sekunde (s) mit dem Webserver auf alle möglichen Aufgaben. Wenn der Druckvorgang abgeschlossen ist, kann ein Befehl zum Entfernen aus der Webserver-Warteschlange gesendet werden. –

1
  • Der Server des HTTPS-Webapp-Hosting kann Proxy den Printserver umkehren, aber da der Drucker für den Benutzer lokal ist, dies nicht funktionieren kann.
  • Der Druckserver sollte die richtigen CORS-Header haben

    Access-Control-Allow-Origin: * 
    

    oder:

    Access-Control-Allow-Origin: https://www.example.com 
    

jedoch there are pitfalls with using the wildcard.

+0

Ich verstehe es nicht, sprichst du über Server-zu-Server-Kommunikation? Es gibt keine Adresse, bei der der Webserver der Anwendung den _printerserver_-Rechner erreichen könnte. – AndreKR

+0

können Sie bitte weitere Informationen darüber, was Ihr Server (der für Ihre Webanwendung) ist? und können Sie bitte teilen, welche Art von Drucker/Modell Sie haben? Wahrscheinlich gibt es andere Lösungen, die sich nicht mit CORS befassen müssen. – dnozay

1

Der einfachste Weg besteht darin, eine Route zur Webapp hinzuzufügen, die lediglich die Anforderung an den Druckserver weiterleitet.Stellen Sie also Ihre AJAX POST-Anfrage an https://myapp.com/print und den serverseitigen Code, der eine Anfrage an http://printerserver/print.php sendet, mit dem gleichen POST-Inhalt, den er selbst erhalten hat. Wie @dnozay sagte, wird dies allgemein reverse proxy genannt. Ja, dazu müssen Sie Ihren Printserver neu konfigurieren, um (authentifizierte) Anfragen vom Webserver zu akzeptieren.

Alternativ können Sie den Printserver auf https umstellen und direkt vom Client aus aufrufen.

Beachten Sie, dass eine unsichere (http) Web-Socket-Verbindung auf einer sicheren (https) Seite probably auch nicht work wird. Und das aus gutem Grund: Im Allgemeinen ist es eine schlechte Idee, Leute irrezuführen, indem sie von einer scheinbar sicheren Seite eine unsichere Verbindung herstellen.

+0

Ich sehe nicht, wie das möglich ist, gegeben http://stackoverflow.com/questions/26615508/how-can-a-web-page-send-a-message-to-the-local-network/26785482# comment42098819_26615508 – AndreKR

+0

@AndreKR meine Antwort bearbeitet – mb21

1

Von dem, was ich von der Frage verstehe, ist printserver nicht von der Webanwendung aus zugänglich, so dass die Reverse-Proxy-Lösung hier nicht funktioniert.

Sie können keine Anfragen vom Browser zum Druckerserver über die Ursprungsrichtlinie senden.

Wenn Sie von einer HTTPS-Seite aus mit dem Printserver kommunizieren möchten, benötigen Sie den Printserver, um die print.php auch als HTTPS verfügbar zu machen.

Sie könnten einen DNS A-Datensatz als Unterdomäne Ihrer Webanwendung erstellen, die in die interne Adresse Ihres Druckservers aufgelöst wird.

Mit diesen Schritten sollten Sie in der Lage sein, Ihre Printserver-Seite zu aktualisieren, um mit permissiven CORS-Kopfzeilen zu antworten, die der Browser dann respektieren sollte. Ich glaube nicht, dass der Browser CORS-Anfragen sogar über verschiedene Protokollschemata (HTTPS vs. HTTP) oder interne Domänen ohne TLD absetzt.

Verwandte Themen