JavaScript跨域调用:从HTTP调用到HTTPS

时间:2011-12-07 11:47:00

标签: javascript ajax http .net-4.0 cross-domain

我需要对同一域的安全(HTTPS)URL进行异步调用。

目前该页面正在使用常规HTTP(非安全)。

换句话说:这是在同一个域中调用URL但使用HTTPS。

在将此调用切换到HTTPS之前,我结束了实现服务器端代理以允许跨域AJAX调用,但现在我面临相同的源策略,因为HTTP和HTTPS也被视为不同的来源。所以这个代理是无法使用的。

摘要:如何在此方案中执行跨域,异步POST请求?

各种说明:

  • 我无法接受任何建议JSONP的答案。异步调用必须使用POST动词。
  • 我正在使用最新版本的jQuery。答案可能基于此库,或任何其他解决此问题。
  • 通过HTTPS访问整个页面不是解决方案。
  • 服务器平台是Microsoft .NET 4.0(ASP.NET 4.0)。
  • UDPATE :CORS不是一个选项。在现代浏览器中没有广泛的支持。

4 个答案:

答案 0 :(得分:14)

首先,我从@missingo和@PiTheNumber中提出了两个问题。

花了很多时间后,我得出结论我要将整个页面切换为HTTPS。那是因为:

  • 大多数现代浏览器都支持CORS,但Internet Explorer从第8版开始有一个专有实现(XDomainRequest对象),可能在某些计算机上禁用(我的Internet安全区默认禁用跨域请求) )。

    • Opera不支持CORS。第12版将支持它,但这不是一个选项,因为用户应该首先采用这个新版本,这将不会在2天内。

    • 我需要执行跨域请求,因为Web客户端应用程序必须请求位于另一个域中的RESTful服务层。没办法。

    • 将所有内容切换为HTTPS会使服务层代理方法再次起作用(这是预期的行为)。

非常感谢,因为这两个答案都帮助我得出了很多结论。

更新

@Sam添加了一条可能对任何人都感兴趣的评论。它是关于如何在Internet Explorer 8和9中获取CORS(参见#7):http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

答案 1 :(得分:9)

我正在使用Access-Control-Allow-Origin。你只需发送标题就可以了。

另见AJAX, Subdomains, and SSL

答案 2 :(得分:2)

您应该重新考虑通过HTTPS访问整个页面,或者至少确定这是不可行的。

通过HTTP加载初始页面和脚本,用户无法保证脚本是您最初打算发送的脚本,并且不受第三方操纵(例如,通过键盘记录密码)。这意味着绕过SOP的任何HTTPS请求都不会提供与最初通过HTTPS提供的页面的HTTPS请求相同的安全保证。

答案 3 :(得分:1)

有人看过:

https://github.com/jpillora/xdomain

它使用postMessage和iframe来实现cors请求,并且是跨浏览器(不需要在IE中修复XDomainRequests)。

也许它会允许跨协议的cors请求?