跨域访问问题,相信你们都有遇到过。这是一个很棘手的问题。不过道高一尺,魔高一丈,对于这类问题,总有解决问题的方案。最近我又接触到了这个问题,解决的途径是ajax+jsonp。javascript
说到这个问题,不得不说一下“同源策略(Same-Origin Policy)”,它是由Netscape提出的一个著名的安全策略。如今全部支持JavaScript 的浏览器都会使用这个策略。所谓同源,就是必须协议、域名、端口都一致的,才叫作同源。例如:http://www.12306.cn和https://www.12306.cn,因为协议不一致,就不是同源。http://127.0.0.1:8080/test1和http://localhost:8080/test1 也不属于同源,由于域名不一致。端口不一样固然也不叫同源了。java
若是非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。这是一个令web开发人员很是手疼的问题。好比,我如今打开百度网页,而后在控制台中请求CSDN的网页,那么就会报如图所示的异常:jquery
在上图中,你们可能会看到这个词儿——“Access-Control-Allow-Origin”,它是W3C标准中为了解决同源策略引发的跨域问题而提出的一种技术——“跨域资源共享(CORS,Cross-Origin Resource Sharing)”。只要你在服务端设定这个Access-Control-Allow-Origin的header就能够容许跨域访问了。有兴趣的话,本身查一下,很简单。不过它有安全隐患,主要是由于支持通配符*。每一个网站均可以随意请求,那就太不安全了。如:web
Query中$.ajax的get方法,是支持跨域访问的,不过dataType要设定为“jsonp”。Jsonp(JSON with Padding)是 json 的一种“使用模式”,可让网页从别的网域获取资料。jsonp是采用的js的回调机制来实现的。使用方式也很简单,代码以下:ajax
在服务器端,从新拼接json数据:json
这样就能够在浏览器获取到异源服务端返回的json数据了。这里返回的跟json格式不同,它的格式是回调函数名+(json数组)。其中小括号不能够省略。不然请求是发送成功了,可是却获取不到数据,由于返回的数据格式出错了。效果图以下:跨域