<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[刘新修]]></title> 
<link>http://liuxinxiu.com:80/index.php</link> 
<description><![CDATA[刘新修的个人博客 (Liuxinxiu'S Blog)]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[刘新修]]></copyright>
<item>
<link>http://liuxinxiu.com:80/CORS/</link>
<title><![CDATA[CORS跨域资源共享 (Cross-origin resource sharing)]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[HTTP相关]]></category>
<pubDate>Mon, 12 Sep 2016 03:30:43 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/CORS/</guid> 
<description>
<![CDATA[ 
	<p>&nbsp;CORS是一个W3C标准，全称是&quot;跨域资源共享&quot; (Cross-origin resource sharing)</p><div>CORS，是一种服务器端的跨域解决方案，这种方案对于跨域的解决代码均在服务器端设置完成。在服务器端接收到客户端的请求后，通过获取到请求的来源站点Origin，如果愿意将资源共享给该站点，则通过设置&ldquo;Access-Control-Allow-Origin&rdquo;报头的值为请求的来源站点。浏览器接收到包含资源的响应后，会提取&ldquo;Access-Control-Allow-Origin&rdquo;响应报头的值，如果此值为*或者包含的源列表包含请求的源站点，则浏览器会允许JavaScript操作获取的资源；否则，不会操作获取的资源。</div><div>&nbsp;</div><div>跨域资源共享（CORS ）是一种网络浏览器的技术规范，CORS系统定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。 它是一个妥协，有更大的灵活性，但比起简单地允许所有这些的要求来说更加安全。</div><div>&nbsp;</div><div>简言之，CORS就是为了让AJAX可以实现可控的跨域访问而生的。</div><div><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;"><strong>以往的解决方案</strong></p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;以前要实现跨域访问，可以通过JSONP、Flash或者服务器中转的方式来实现，但是现在我们有了CORS。</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;CORS与JSONP相比，无疑更为先进、方便和可靠。</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;1、 JSONP只能实现GET请求，而CORS支持所有类型的HTTP请求。</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;2、 使用CORS，开发者可以使用普通的XMLHttpRequest发起请求和获得数据，比起JSONP有更好的错误处理。</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;3、 JSONP主要被老的浏览器支持，它们往往不支持CORS，而绝大多数现代浏览器都已经支持了CORS（这部分会在后文浏览器支持部分介绍）。</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;"><strong>详细内容</strong></p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;要使用CORS，我们需要了解前端和服务器端的使用方法。</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;1、&nbsp; 前端</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;以前我们使用Ajax，代码类似于如下的方式：</p><div class="dp-highlighter bg_html" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; overflow: auto; word-break: break-word; margin: 0px;"><ol class="dp-xml" start="1" style="padding-left: 40px; border: none; color: rgb(92, 92, 92); margin-right: 0px !important; margin-bottom: 1px !important; margin-left: 45px !important;"><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;"><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">var&nbsp;</span><span class="attribute" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">xhr</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;=&nbsp;</span><span class="attribute-value" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">new</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;XMLHttpRequest();&nbsp;&nbsp;</span></span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">xhr.open(&quot;GET&quot;,&nbsp;&quot;/hfahe&quot;,&nbsp;true);&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">xhr.send(); &nbsp;</span></li></ol></div><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;这里的&ldquo;/hfahe&rdquo;是本域的相对路径。</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;如果我们要使用CORS，相关Ajax代码可能如下所示：</p><div class="dp-highlighter bg_html" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; overflow: auto; word-break: break-word; margin: 0px;"><ol class="dp-xml" start="1" style="padding-left: 40px; border: none; color: rgb(92, 92, 92); margin-right: 0px !important; margin-bottom: 1px !important; margin-left: 45px !important;"><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;"><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">var&nbsp;</span><span class="attribute" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">xhr</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;=&nbsp;</span><span class="attribute-value" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">new</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;XMLHttpRequest();&nbsp;&nbsp;</span></span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">xhr.open(&quot;GET&quot;,&nbsp;&quot;http://www.liuxinxiu.com/hfahe&quot;,&nbsp;true);&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">xhr.send(); &nbsp;</span></li></ol></div><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;请注意，代码与之前的区别就在于相对路径换成了其他域的绝对路径，也就是你要跨域访问的接口地址。</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;我们还必须提供浏览器回退功能检测和支持，避免浏览器不支持的情况。</p><div style="margin: 0px; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;"><div class="dp-highlighter bg_html" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; overflow: auto; word-break: break-word; margin: 0px;"><ol class="dp-xml" start="1" style="padding-left: 40px; border: none; color: rgb(92, 92, 92); margin-right: 0px !important; margin-bottom: 1px !important; margin-left: 45px !important;"><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;"><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">function&nbsp;createCORSRequest(method,&nbsp;url)&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;var&nbsp;<span class="attribute" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">xhr</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;=&nbsp;</span><span class="attribute-value" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">new</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;XMLHttpRequest();&nbsp;&nbsp;</span></span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;if&nbsp;(&quot;withCredentials&quot;&nbsp;in&nbsp;xhr)&nbsp;&#123;&nbsp;&nbsp;</span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;此时即支持CORS的情况&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;检查XMLHttpRequest对象是否有&ldquo;withCredentials&rdquo;属性&nbsp;&nbsp;</span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&ldquo;withCredentials&rdquo;仅存在于XMLHTTPRequest2对象里&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;xhr.open(method,&nbsp;url,&nbsp;true);&nbsp;&nbsp;</span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&#125;&nbsp;else&nbsp;if&nbsp;(typeof!=&nbsp;&quot;undefined&quot;)&nbsp;&#123;&nbsp;&nbsp;</span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;否则检查是否支持XDomainRequest，IE8和IE9支持&nbsp;&nbsp;</span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;XDomainRequest仅存在于IE中，是IE用于支持CORS请求的方式&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">xhr</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;=&nbsp;</span><span class="attribute-value" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">new</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;XDomainRequest();&nbsp;&nbsp;</span></span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;xhr.open(method,&nbsp;url);&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;</span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&#125;&nbsp;else&nbsp;&#123;&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;</span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;否则，浏览器不支持CORS&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">xhr</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;=&nbsp;</span><span class="attribute-value" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">null</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">;&nbsp;&nbsp;</span></span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;return&nbsp;xhr;&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&#125;&nbsp;&nbsp;</span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">var&nbsp;<span class="attribute" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">xhr</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;=&nbsp;</span><span class="attribute-value" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">createCORSRequest</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">('GET',&nbsp;url);&nbsp;&nbsp;</span></span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">if&nbsp;(!xhr)&nbsp;&#123;&nbsp;&nbsp;</span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;&nbsp;throw&nbsp;new&nbsp;Error('CORS&nbsp;not&nbsp;supported');&nbsp;&nbsp;</span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&#125;&nbsp;&nbsp;</span></li></ol></div></div><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;现在如果直接使用上面的脚本进行请求，会看到浏览器里控制台的报错如下：</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;"><img src="http://at.liuxinxiu.com/2016/09/image/1.jpg" width="558" height="201" alt="" /></p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;错误显示的很明显，这是因为我们还未设置Access-Control-Allow-Origin头。</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;2、&nbsp; 服务器</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;服务器端对于CORS的支持，主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置，就可以允许Ajax进行跨域的访问。</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;HTTP 头的设置方法有很多，<a href="http://enable-cors.org/" style="color: rgb(255, 51, 102); text-decoration: none;">http://enable-cors.org/</a>这篇文章里对各种服务器和语言的设置都有详细的介绍，下面我们主要介绍Apache和PHP里的设置方法。</p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Apache：Apache需要使用mod_headers模块来激活HTTP头的设置，它默认是激活的。你只需要在Apache配置文件的&lt;Directory&gt;,&nbsp;&lt;Location&gt;,&nbsp;&lt;Files&gt;或&lt;VirtualHost&gt;的配置里加入以下内容即可：</p><div class="dp-highlighter bg_html" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; overflow: auto; word-break: break-word; margin: 0px;"><ol class="dp-xml" start="1" style="padding-left: 40px; border: none; color: rgb(92, 92, 92); margin-right: 0px !important; margin-bottom: 1px !important; margin-left: 45px !important;"><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;"><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">Header&nbsp;set&nbsp;Access-Control-Allow-Origin&nbsp;* &nbsp;</span></span></li></ol></div><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;PHP：只需要使用如下的代码设置即可。</p><div class="dp-highlighter bg_html" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; overflow: auto; word-break: break-word; margin: 0px;"><ol class="dp-xml" start="1" style="padding-left: 40px; border: none; color: rgb(92, 92, 92); margin-right: 0px !important; margin-bottom: 1px !important; margin-left: 45px !important;"><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;"><span class="tag" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&lt;?</span><span class="tag-name" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">php</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;&nbsp;</span></span></li><li style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: rgb(248, 248, 248);"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;">&nbsp;header(&quot;Access-Control-Allow-Origin:*&quot;); &nbsp;</span></li></ol></div><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;以上的配置的含义是允许任何域发起的请求都可以获取当前服务器的数据。当然，这样有很大的危险性，恶意站点可能通过XSS攻击我们的服务器。所以我们应该尽量有针对性的对限制安全的来源，例如下面的设置使得只有http://www.liuxinxiu.com 这个域才能跨域访问服务器的API。</p><div class="dp-highlighter bg_html" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; overflow: auto; word-break: break-word; margin: 0px;"><ol class="dp-xml" start="1" style="padding-left: 40px; border: none; color: rgb(92, 92, 92); margin-right: 0px !important; margin-bottom: 1px !important; margin-left: 45px !important;"><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal outside; color: inherit; line-height: 1.6; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: rgb(0, 0, 0); background-color: inherit;"><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">Access-Control-Allow-Origin:&nbsp;http://www.liuxinxiu.com &nbsp;</span></span></li></ol></div><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;"><strong>浏览器支持情况</strong></p><p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;"><strong><img src="http://at.liuxinxiu.com/2016/09/image/2.jpg" width="480" height="295" alt="" /></strong></p></div><br/>Tags - <a href="http://liuxinxiu.com:80/tags/cors/" rel="tag">cors</a>
]]>
</description>
</item><item>
<link>http://liuxinxiu.com:80/CORS/#blogcomment</link>
<title><![CDATA[[评论] CORS跨域资源共享 (Cross-origin resource sharing)]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/CORS/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>