前端跨域问题,先概括一下总的方法,然后详细解释常用的
产生跨域问题的原因
跨域问题是浏览器同源策略限制,当前域名的js只能读取同域下的窗口属性。
跨域问题产生的场景
当要在在页面中使用js获取其他网站的数据时,就会产生跨域问题,比如在网站中使用ajax请求其他网站的天气、快递或者其他数据接口时以及hybrid app中请求数据,浏览器就会提示以下错误。这种场景下就要解决js的跨域问题。
XMLHttpRequest cannot load http://你请求的域名. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://当前页的域名' is therefore not allowed access.
哪些情况会产生跨域问题
- 一个网站的网址组成包括协议名,子域名,主域名,端口号。比如 https://github.com/ ,其中https是协议名,www是子域名,github是主域名,端口号是80,当在在页面中从一个url请求数据时,如果这个url的协议名、子域名、主域名、端口号任意一个有一个不同,就会产生跨域问题。
- 即使是在 http://localhost:80/ 页面请求 http://127.0.0.1:80/ 也会有跨域问题
解决跨域问题
解决跨域问题有以下一种方式
1、使用jsonp(详细的文章在下一篇)
2、服务端代理
3、服务端设置Request Header头中Access-Control-Allow-Origin
为指定可获取数据的域名
a.服务端设置
Access-Control-Allow-Origin
这种方式只要服务端把response的header头中设置Access-Control-Allow-Origin为制定可请求当前域名下数据的域名即可。一般情况下设为即可。这样客户端就不需要使用jsonp来获取数据。 b.关于Access-Control-Allow-Origin设为是否会有安全问题,知乎上有个讨论。
http://www.zhihu.com/question/22992229
c.浏览器支持
d.Access-Control-Allow-Origin是html5新增的一项标准,IE10以下是不支持的,所以如果产品面向的是PC端,就要使用服务端代理或jsonp。
4、CORF
- CORF是跨站资源共享的简称,具体细节过多,详情可以参考 http://www.html5rocks.com/en/tutorials/cors/ https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS
-
如果只是简单的获取局部数据的话,操作并不难,下面是
Express
的一个简单实现(REST API端)app.all('*',function(req,res,next){ res.set({ 'Access-Control-Allow-origin' : '*', 'Access-Control-Allow-Headers' : 'X-Requested-With', 'Access-Control-Allow-Methods' : 'GET' }) ; next(); });
-
我用的http://127.0.0.1:1337作为静态文件服务器,从http://127.0.0.1:1336 REST API获取数据。
var xhr = new XMLHttpRequest(); xhr.open(‘GET’,’http://127.0.0.1:1336/blog’,true); xhr.addEventListener(‘load’,function(e){ console.log(this.response); }) xhr.send();
Access-Control-Allow-origin
属于必填项,*属于通配符,如果没有,就会报错XMLHttpRequest cannot load http://127.0.0.1:1336/blog. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:1337' is therefore not allowed access.。
5、图像Ping (略)
6、flash (略)
7、iframe(略)