Javascript HTTP GET和POST

时间:2013-04-19 09:48:42

标签: javascript http

启动HTTP GET或POST请求时:

  • 常见浏览器不允许Javacript调用跨域
  • 所以这意味着来自给定域的每个HTTP请求请求头中的“主机”代表原始主机,比如foo.com,并且它不能被客户端请求修改?
  • 此外,当请求来自子域名(如bar.foo.com)时,请求标题中的“主机”将为“bar.foo.com”
  • 在进行跨域HTTP请求时也是如此,即“主机”将是foo.com或者来自子域bar.foo.com,并且接收端(另一个域)将看到“主持“分别作为这些主机?

4 个答案:

答案 0 :(得分:1)

一切都通过HTTP浏览器沙箱(不仅仅是AJAX调用!IFRAMEs基于相同的条件有限制,针对不同的事情 - 即,你无法控制另一个域/主机/端口/ proto上的IFRAME的内容,只需加载页面并查看加载内容的URI。JS中的内容是禁止的)是在客户端而不是服务器端完成的:您的浏览器将主动拒绝查询没有的内容:

  • 相同的主机名(子域名计为不同的主机名)
  • 同一个端口
  • 相同的访问方法(HTTP或HTTPS)

对于AJAX,这会导致一个大的红色“由于安全而无法获得” - 发生错误。对于某些浏览器,请求确实发生:有一种方法可以使用访问控制头来绕过此限制。这些有效地告诉您的浏览器“我对 x ”很友好,其中x是域的通配符列表(其中 * 表示所有内容)。

为了解决这个问题,浏览器将执行请求,如果CORS未启用,则会主动触发异常(XMLHttpRequest: x is not allowed by y)。但是,请求已经发生

显而易见的解决方案是添加一个Access-Control-Allow-Origin标头,以表示对此站点的跨域查询是可以的。但是,请记住两件事:

  • 大多数浏览器都有它,但有些浏览器没有(IE8<。<。)
  • 如果URL在脚本中被硬编码,那么CORS会有一些小错误(请阅读它!)

因此,您需要一个针对IE的JSONP回退。但是,请记住所有这些都是客户端,并不能保证没有任何浏览器会主动忽略CORS或webkit安全模型。整个模型还依赖于客户端Host解析。

答案 1 :(得分:1)

如果问题是“这是真的”,那么答案就是否定。

  • 浏览器执行允许JavaScript跨域创建GET和POST请求。他们不允许的是javascript从跨域请求中读取响应。

  • HTTP标头中的“主机”表示发送请求的主机,而不是导致主机的网站。 HOST是必要的,因为服务器通常是共享的,一个服务器可能托管许多单独的网站,因此他们需要知道正在请求哪一个。

  • 创建网站的网站通常(虽然并非总是)在“REFERER”HTTP标头中标识。

答案 2 :(得分:0)

支持CORS的服务器将检查请求中的Origin标头。该值将如您所述,请求指定的服务器。在它的回复中,服务器将发送一个名为Access-Control-Allow-Origin的标头。如果匹配Origin,则浏览器将接受响应。它显然也要求浏览器支持CORS。

维基百科有一个相当不错的explanation of how it works

答案 3 :(得分:-1)

  • Host HTTP请求标头始终是请求转到的域。

  • 如果您使用XMLHTTPRequest方法启动HTTP GET或POST请求,那么如果发送它的JavaScript代码,它将不允许您发送请求与您发送请求的URL不在同一个域中 - 除非浏览器支持跨源资源共享。

  • 如果浏览器 支持cross-origin resource sharing (CORS),那么它会将您的请求发送到其他域,但会有一个额外的Origin标头,表明所投放的网站提出请求的JavaScript。如果服务器允许该请求,它将使用Access-Control-Allow-Origin标头回复,列出它将接受请求的域。