我想从一个在非安全页面(https://site.com/ajaxservice/)内运行的javascript向一个安全的uri(http://site.com/page.htm)创建一个XMLHttpRequest。我已经尝试了各种各样的疯狂的东西,比如iframe和动态脚本元素,到目前为止还没有去。我知道我违反了“相同的原产地政策”,但必须有一些方法来实现这一目标。
我会采用任何一种古怪的解决方案,而不是用javascript写的SSL协议。
答案 0 :(得分:5)
正如您所提到的,由于same origin policy,默认情况下无效。现代浏览器正在实现CORS(跨源资源共享),您可以使用它来解决此问题。但是,这仅适用于Internet Explorer 8 +,Firefox 3.5 +,Safari 4+和Chrome,并且需要一些服务器端工作。您可能需要查看以下文章以进一步阅读此主题:
您也可以将JSONP用作Dan Beam suggested in another answer。它需要一些额外的JavaScript工作,您可能需要“填充”您的Web服务响应,但它是另一个适用于所有当前浏览器的选项。
答案 1 :(得分:4)
你不能用XHR规避跨域起源(嗯,仅在Firefox 3.5中得到用户的许可,不是一个好的解决方案)。从技术上讲,从端口80(http)移动到443(https)正在破坏该策略(必须是相同的域和端口)。这是规范本身网站的示例 - http://www.w3.org/Security/wiki/Same_Origin_Policy#General_Principles。
您是否研究过JSONP(http://en.wikipedia.org/wiki/JSON#JSONP)或CSSHttpRequests(http://nb.io/hacks/csshttprequest)?
JSONP是一种向页面添加<script>
标记的方法,该网页具有跨域预定义的全局回调(因为您可以将<script>
s src
放到网络上的任意位置)。例如:
<script>
function globalCallback (a) { /* do stuff with a */ }
然后您将<script>
标记插入到其他域中,如下所示:
var jsonp = document.createElement('script');
json.setAttribute('src','http://path.to/my/script');
document.body.appendChild(jsonp);
</script>
在外部脚本的源代码中,您必须使用要传递给它的数据调用globalCallback
函数,如下所示:
globalCallback({"big":{"phat":"object"}});
在脚本执行后,您将获得所需的数据!
CSSHttpRequests有点像黑客,所以我从来没有必要使用它,但如果你不喜欢JSONP,请随意尝试一下,:)。
答案 2 :(得分:2)
你说你会用不到用JavaScript编写的SSL协议......但我认为你的意思是你必须自己编写。
opensource Forge项目提供了一个JavaScript TLS实现,以及一些用于处理跨域请求的Flash:
http://github.com/digitalbazaar/forge/blob/master/README
查看自述文件末尾的博文,深入了解其工作原理。
答案 3 :(得分:0)
我不认为这是可能的。以前问过: Ajax using https on an http page