10

所以我有一个需要与桌面应用程序通信的 GWT webapp。为了实现这一点,桌面程序在给定端口(例如 )启动网络服务器http://localhost:9000

我已经实现了 JSON-P 通信来绕过跨域过滤器,这在本地测试时工作正常(webapp 运行在http://localhost:8888)。问题是,生产网站是通过 https 提供的,没有浏览器允许您通过 http 从 https 请求 javascript。

所以我尝试了一些东西。

我已经在HttpServletResponse.addHeader("Access-Control-Allow-Origin", "*")为 GWT javascript 提供服务的服务器和 javascript 尝试向其发出请求并发出 HTTP 请求的服务器上使用 Java 设置了“Access-Control-Origin:*”标头,但这被同一来源阻止过滤器(可能是因为我试图从 https 向 http 发出请求。)

我尝试使用来自新窗口(通过调用 $wnd.open 创建)的 Json-P 通信,没有 URL 希望它可以通过 http 加载,但它是通过 https 加载的,所以我遇到了和以前一样的问题.

有没有办法从通过 https 到 http 的 javascript 发出跨域请求?在本地主机上运行 https 没有任何可行的方法(自签名证书在发出 JSON-P 请求时被阻止。)

4

1 回答 1

2

假设您要部署的计算机可以访问 Internet,则此问题的最佳解决方案是在托管 Web 应用程序的主站点(例如 localhost.example.com)上注册一个子域,并将 DNS 条目设置为指向127.0.0.1 。然后,您可以获得 localhost.example.com 的签名 https 证书,并将该证书与您的应用程序一起分发。

警告语:

  • 因为证书是随你的应用程序分发的,所以它不是秘密的,所以请确保不要为 *.example.com 或类似的东西提供证书。幸运的是,攻击者需要在本地机器上运行一个服务器来利用它,在这种情况下,他们已经可以访问你所有的 cookie 和东西。
  • 如果/当您的证书过期时,事情可能会中断。这可能需要让您的客户端应用程序从您的 Web 服务器下载证书。这样做的安全隐患应该不会比在二进制文件中分发它更糟糕。
  • 如果您对安全性非常敏感,则使用完全独立的域 (localhostexample.com) 可以防止未来的漏洞利用或错误。
于 2017-08-17T16:19:46.790 回答