有一个项目有这样的需求。希望页面整体是HTML静态文件,其中动态的部分由外部Web Service提供。貌似用Ajax就能轻易解决。但问题来了,这个外部WebSerice和静态HTML文件不属于同一个Domain,于是Cors问题就产生了,即允许跨域的访问。
之所以有这个跨域访问限制,是从安全角度考虑,这并不是由HTTP协议控制的,而是通过浏览器自身的判断。而这次我们出现问题的背景,则是因为使用了Azure,两个存储空间差异引起的。
大体解决方法有三个
- 使用JSONP技术,需要修改WebService的处理逻辑
- 使用CORS技术
- 使用定期Copy,将WebService的JSON结果Copy到静态文件服务器上。
我们选择了CORS技术。调查结果如下。
第一步,通过caniuse.com网站,查到CORS支持的浏览器状况(http://caniuse.com/#search=CORS)
第二步,CORS有两种方式,Simple和Prefight。两种区别在于,后者可以在Head上加入一些Options。
简单来说Simple的时候,Request Head里面加入(Origin: http://localhost:8080),如果服务器正确处理后,Reponse里面会有(Access-Control-Allow-Origin: http://localhost:8080)。如果是Prefight,则要稍微复杂一些。
第三步,确实IE的支持。因为本次需要对应IE
经过反复查验,IE10之后完全支持,IE8,9部分支持,IE7以前不支持。关键的IE8,9的部分支持包括
- IE8,9不支持XMLHTTPRequest,只支持特有的XDomainRequest来实现CORS(xdr.js)
- 即使如此,只支持Simple CORS
第四步,由于本次需要支持IE9,同时又需要Option Head。后面只能和用户协商,要么不支持IE9,要么去除Head里面的Option。
参考网站
http://dev.classmethod.jp/etc/about-cors/
http://dev.classmethod.jp/cloud/cors-cross-origin-resource-sharing-cross-domain/