Mar
19
js的跨域问题一直很让前端开发头痛。因为只在大一些的应用都会有多个域名。最常用的应用的就是上传。
一般架构上考虑读写压力,会都会把图片等附件上传的功能单独一台服务器或者一个域名,可问题就来了。
html无论是html4还是html5都不允许跨域请求。反正返回来的东西就是空白。
但事实上不是这样,真实情况事:
返回来的东西被浏览器限制了
假如直接允许js直接访问非当前网站的内容时,访问网站A时,网站A的某个js程序请求网站B的某个服务。如登录,上传或者获取机密的数据。而这些都是发生在用户不知情的情况。
所以必须限制不是同一个网站下获取内容。
而实际情况下,多个域名确实是属性同一个服务,跨域被限制了会带来很多不便。解决方案就是:
只需要网站B的服务在返回时增加一个头信息,浏览器就会允许请求的域名。
Access-Control-Allow-Origin: http://atim.cn
其实http://atim.cn这个域名
是由浏览器根据请求发生时的页面url分析出来,并通过header信息传给B服务器
Origin: http://www.a3.com
考虑安全,所以不建议把Access-Control-Allow-Origin设置为*,除非这是公用服务
实际上大家把这个解决方案叫:Cross-Origin Resource Sharing,跨域资源共享,简称 CORS。
一般架构上考虑读写压力,会都会把图片等附件上传的功能单独一台服务器或者一个域名,可问题就来了。
html无论是html4还是html5都不允许跨域请求。反正返回来的东西就是空白。
但事实上不是这样,真实情况事:
返回来的东西被浏览器限制了
假如直接允许js直接访问非当前网站的内容时,访问网站A时,网站A的某个js程序请求网站B的某个服务。如登录,上传或者获取机密的数据。而这些都是发生在用户不知情的情况。
所以必须限制不是同一个网站下获取内容。
而实际情况下,多个域名确实是属性同一个服务,跨域被限制了会带来很多不便。解决方案就是:
只需要网站B的服务在返回时增加一个头信息,浏览器就会允许请求的域名。
Access-Control-Allow-Origin: http://atim.cn
其实http://atim.cn这个域名
是由浏览器根据请求发生时的页面url分析出来,并通过header信息传给B服务器
Origin: http://www.a3.com
考虑安全,所以不建议把Access-Control-Allow-Origin设置为*,除非这是公用服务
实际上大家把这个解决方案叫:Cross-Origin Resource Sharing,跨域资源共享,简称 CORS。