网页如何向本地网络发送消息

时间:2014-10-28 18:12:08

标签: https websocket cors mixed-content

我们的Web应用程序有一个按钮,可以将数据发送到本地网络上的服务器,然后在打印机上打印一些内容。

到目前为止很容易:该按钮通过令牌向http://printerserver/print.php触发了一个AJAX POST请求,该页面连接到Web应用程序以验证令牌并获取要打印的数据然后打印。

但是,我们现在通过HTTPs提供我们的Web应用程序(我宁愿不再回到HTTP)并且新版本的Chrome和Firefox不再向HTTP地址发出请求,它们不会甚至发送检查CORS头的请求。

现在,什么是跨协议XHR的现代替代品? Websockets是否遭遇同样的问题? (谷歌搜索没有说明这里的当前状态是什么。)我可以使用TCP套接字吗?我也不愿意切换到GET请求,因为该操作不是幂等的,它可能对预加载和缓存有实际意义。

我可以以任何方式更改打印机服务器上的应用程序(因此我可以用NodeJS替换它)但我无法更改用户的浏览器(信任 printerserver的自签名证书例如)。

4 个答案:

答案 0 :(得分:1)

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

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

如果网络服务器可以与打开了打印服务器的网络上的某些内容进行ssh连接,则可以执行以下操作:ssh params user @ host 这里有一些curl命令

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

答案 1 :(得分:1)

  • 托管https webapp的服务器可以反向代理打印服务器, 但由于打印机对用户来说是本地的,因此可能无法正常工作。
  • 打印服务器应具有正确的CORS标头

    Access-Control-Allow-Origin: *
    

    或:

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

然而there are pitfalls with using the wildcard

答案 2 :(得分:1)

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

或者,您可以将printserver切换为https并直接从客户端调用它。

请注意,安全(https)页面probably上的不安全(http)Web套接字连接也不会work。并且有充分的理由:通常,通过从他们认为是安全页面的不安全的连接来误导人们是一个坏主意。

答案 3 :(得分:1)

根据我对该问题的理解,无法从Web应用程序访问printserver,因此反向代理解决方案无效

您无法通过跨源策略向浏览器发出请求。

如果希望从HTTPS页面与printserver通信,则需要printserver将print.php公开为HTTPS。

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

有了这些步骤,您应该能够更新您的打印服务器页面,以响应浏览器应该尊重的许可CORS标头。我不认为浏览器甚至会在不使用TLD的情况下跨不同的协议方案(HTTPS与HTTP)或内部域发出CORS请求。