8

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

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

但是,我们现在通过 HTTPs 交付我们的 Web 应用程序(我不想为此返回 HTTP),并且较新版本的 Chrome 和 Firefox 不再向 HTTP 地址发出请求,它们甚至不发送请求检查 CORS 标头。

现在,跨协议 XHR 的现代替代方案是什么?Websockets 也有同样的问题吗?(谷歌搜索并没有弄清楚这里的当前状态。)我可以使用 TCP 套接字了吗?我也不想切换到 GET 请求,因为该操作不是幂等的,它可能对预加载和缓存有实际影响。

我可以以任何方式更改打印机服务器上的应用程序(所以我可以用 NodeJS 或其他东西替换它),但我不能更改用户的浏览器(例如,信任打印机服务器的自签名证书)。

4

4 回答 4

1

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

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

如果网络服务器可以与打印服务器所在的网络上的某物建立 ssh 连接,您可以执行以下操作: ssh params user@host some curl command here

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

于 2014-11-06T08:36:56.703 回答
1

最简单的方法是向 webapp 添加一个路由,该路由仅将请求中继到打印服务器。因此,向 发出您的 AJAX POST 请求https://myapp.com/print,并为向 发出请求的服务器端代码提供http://printerserver/print.php与它自己收到的完全相同的 POST 内容。正如@dnozay 所说,这通常称为反向代理。是的,要做到这一点,您必须重新配置您的打印服务器以接受来自网络服务器的(经过身份验证的)请求。

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

请注意,安全 (https) 页面上的不安全 (http) web-socket 连接可能不起作用。并且有充分的理由:通常通过在他们看来是安全的页面上建立不安全的连接来误导人们是一个坏主意。

于 2014-11-06T17:18:46.857 回答
1
  • 托管 https webapp 的服务器可以反向代理打印服务器,但由于打印机是用户本地的,这可能不起作用。
  • 打印服务器应具有正确的 CORS 标头

    Access-Control-Allow-Origin: *
    

    或者:

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

然而,使用通配符有一些陷阱

于 2014-11-06T16:44:32.623 回答
0

根据我从问题中了解到的情况,无法从 Web 应用程序访问打印服务器,因此反向代理解决方案在这里不起作用

跨域策略限制您从浏览器向打印服务器发出请求。

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

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

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

于 2014-11-06T19:46:01.343 回答