所以我有一个需要与桌面应用程序通信的GWT web应用程序。为了完成这个任务,桌面程序在一个给定的端口启动一个web服务器(比如,http://localhost:9000
)。
我已经实现了JSON-P通信来绕过跨域过滤器,这在本地测试时工作良好(webapp运行在http://localhost:8888
)。问题是,生产网站是通过https提供的,没有浏览器会允许你从https通过http请求javascript。
所以我尝试了一些事情。
我设置了"Access-Control-Origin: *"头使用Java的HttpServletResponse.addHeader("Access-Control-Allow-Origin", "*")
服务器上的服务GWT javascript和服务器,javascript正试图使请求,并使HTTP请求,但这被相同的来源过滤器阻止(可能是因为我试图使请求从https到HTTP。)
我已经尝试使用Json-P通信从一个新的窗口(通过调用$ wind .open创建)没有URL希望它会加载http,但它是加载https,所以我遇到了同样的问题,因为以前。
是否有办法使跨域请求从javascript通过https服务到http?没有任何可行的方法在本地主机上运行https(自签名证书在发出JSON-P请求时会被阻止)
假设您要部署的计算机具有互联网访问权限,解决此问题的最佳方案是在web应用托管的主站点上注册一个子域(例如localhost.example.com),并设置DNS条目指向127.0.0.1。然后,您可以为localhost.example.com获取签名的https证书,并将该证书与应用程序一起分发。
警示语:
- 由于证书是与应用程序一起分发的,因此它不是秘密的,因此请确保不要为*.example.com或类似的东西提供证书。幸运的是,攻击者需要在本地机器上运行服务器来利用它,在这种情况下,他们已经可以访问您的所有cookie和内容。
- 如果/当你的证书过期,事情可能会破裂。这可能需要您的客户端应用程序从您的web服务器下载证书。这样做的安全隐患应该不会比在二进制文件中分发它更糟糕。
- 如果你对安全非常敏感,使用一个完全独立的域名(localhostexample.com)可以防止未来的漏洞利用或错误。