2014-10-28 112 views
6

我们的网络应用程序有一个按钮,应该将数据发送到本地网络上的服务器,然后在本地网络上打印某些内容。网页如何向本地网络发送消息

到目前为止,这很容易:该按钮触发了带有令牌的http://printerserver/print.php的AJAX POST请求,该页面连接到Web应用程序以验证令牌并获取要打印并打印的数据。但是,我们现在通过HTTP传递我们的Web应用程序(我宁愿不要回到HTTP),而新版本的Chrome和Firefox不再向HTTP地址发出请求,他们不会再向HTTP地址发送请求,甚至可以发送请求来检查CORS头。

现在,什么是跨协议XHR的现代替代方案? Websockets遭受同样的问题吗? (谷歌搜索没有说明这里的当前状态。)我可以使用TCP套接字吗?我宁愿不切换到GET请求,因为这个动作不是幂等的,它可能对预加载和缓存有实际意义。我可以用任何方式更改打印机服务器上的应用程序(所以我可以用NodeJS或其他东西替换它),但是我无法更改用户的浏览器(例如,信任自签名证书,例如printersserver)。

+0

只是一个想法,但你有没有尝试使用CURL来提出您的要求? 由于CURL创建自己的会话,它不应该受浏览器行为方式的影响。 – 2014-11-05 12:40:40

+1

我认为这个问题很明显:机器_printerserver_和用户的浏览器在一个网络中,网络服务器在互联网上。 – AndreKR 2014-11-05 13:42:49

+0

如果我理解正确,您正尝试从HTTPS网站调用“http://printerserver/print.php”。 尝试在443端口运行“http://printerserver/print.php”服务器 - 以支持HTTPS,因此您的呼叫将采用相同的协议。 – 2014-11-06 19:10:34

回答

1

您可以将网络服务器上的打印请求存储在队列中,并使打印服务器定期轮询打印请求。

如果这是不可能的,我会在网络服务器和打印服务器网络之间建立隧道或VPN。这样,您可以在服务器端而不是客户端上从Web服务器发出打印请求。如果使用curl,则会有标志忽略无效的SSL证书等(我仍然怀疑无论如何引入一个队列更好,因此打印请求不会被阻止)。

如果Web服务器可以使网络上的SSH连接东西在打印服务器上,你可以这样做:SSH用户PARAMS @主机一些curl命令这里

我能想到的第三个选项,如果printserver可以绑定到例如web服务器域的子域名,例如:print.somedomain.com,那么您可以通过somedomain.com证书使其可信,IIRC您必须从printserver证书创建CSR(证书签名请求),并使用somedomain.com证书对其进行签名。也许它甚至不需要成为这个本身的子域,但也许这是浏览器在客户端执行它的要求。

+0

我已经存储了这些请求,而且printerserver已经连接到web服务器以获取其数据。我只需要一种方式让浏览器告诉打印机服务器执行此操作,因此点击后几秒钟就会发生打印。 你最后一段看起来很有趣,但对我来说太模糊了。 – AndreKR 2014-11-06 18:41:23

+0

打印服务器无法决定何时打印?如果您在网络服务器上存储了所有需要完成的任务,并且打印服务器会在网络服务器每隔X秒钟检查一次它应该执行的任务。打印完成后,它可以发送一条命令将其从Web服务器队列中删除。 – 2014-11-07 08:14:58

1
  • 托管Web应用程序的HTTPS可以反向代理打印服务器, 但由于打印机是本地用户,这可能无法正常工作的服务器。
  • 打印服务器必须具有正确的CORS头

    Access-Control-Allow-Origin: * 
    

    或:

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

然而there are pitfalls with using the wildcard

+0

我不明白,你在说服务器到服务器通信吗?没有地址可以让应用程序的网络服务器访问_printerserver_机器。 – AndreKR 2014-11-06 18:39:07

+0

可以请你分享关于你的服务器(你的webapp)的更多信息吗?你能分享一下你有什么样的打印机/型号吗?有可能有其他解决方案可能不需要处理CORS。 – dnozay 2014-11-06 19:30:58

1

最简单的方法是向web应用添加一条路由,该路由除了将请求转发给打印服务器之外无非是。因此,请将您的AJAX POST请求发送至https://myapp.com/print,并向发出请求的服务器端代码提供http://printerserver/print.php,并将其自身收到的POST内容完全相同。正如@dnozay所说,这通常被称为reverse proxy。是的,要做到这一点,您必须重新配置您的打印服务器才能接受来自网络服务器的(经过身份验证的)请求。

或者,您可以将打印服务器切换到https并直接从客户端调用它。

请注意,安全(https)页面probably上的不安全(http)网络套接字连接也不会work。有充分的理由:通过将看起来不安全的连接与安全页面联系起来,误导人们是一个不错的主意。

+0

我不明白这怎么可能,给定http://stackoverflow.com/questions/26615508/how-can-a-web-page-send-a-message-to-the-local-network/26785482# comment42098819_26615508 – AndreKR 2014-11-06 18:37:28

+0

@AndreKR编辑我的答案 – mb21 2014-11-06 19:25:41

1

从我所了解的问题中,printserver无法从Web应用程序访问,因此反向代理解决方案在此处不起作用

您被禁止通过跨源策略向浏览器发送请求。

如果希望从HTTPS页面与打印服务器通信,则需要打印服务器将print.php作为HTTPS公开。

您可以创建一个DNS A记录作为您的Web应用程序的子域,该域解析为您的打印服务器的内部地址。

通过这些步骤,您应该能够更新您的打印服务器页面,以使浏览器应尊重的宽容的CORS头部响应。我认为浏览器甚至不会在不使用TLD的情况下跨不同的协议模式(HTTPS vs HTTP)或内部域发出CORS请求。