首先,为什么会出现跨域问题是因为客户端浏览器的同源策略,即浏览器不允许不同的站点源相互访问。试想,如果没有这个东西,站点中的cookies、账号/密码等安全信息会不会很容易被其他站点获取。二、解决思路是客户端浏览器为了安全使用同源策略,但是服务端没有这个限制,所以我们只能使用服务端进行跨域。不管是jsop,core,还是proxy的方式,都需要service的配合。哈哈,这也是为什么在后端和生产环境很少听到跨域问题的原因,所以这里介绍几种开发环境的方法。三、解决方案1、完全交给后端解决,取值请求头信息(核心),前端什么都不用做。比如express.js中的配置如下,其他后端语言也一样app.all('*',function(req,res,next){res.header("Access-Control-Allow-Origin","*");res.header("Access-Control-Allow-Headers","X-Requested-With");res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");res.header("X-Powered-By",'3.2.1')??res.header("Content-Type","application/json;charset=utf-8");下一个();});2、使用nginx反向代理,在配置文件nginx.conf中找到server{}对象,更改项目地址Root,配置代理地址proxy_pass,此方法适用于前端静态文件:location/{rootD:/浏览客户端/分布;#自己的前端项目地址索引index.htmlindex.htm;}#解决跨域定位/api{#自定义nginx接口前缀proxy_passhttp://127.0.0.1:3000;#后台api接口地址proxy_redirectdefault;#设置主机头和客户端真实地址,以便服务器获取客户端真实IPproxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}3.如果使用vue-cli搭建的项目,可以直接使用proxyTable模块,项目框架已经集成,在/confif/index.j中找到配置文件,配置如下//proxy配置表,这里可以配置具体的请求代理到对应的API接口proxyTable:{"/adv":{target:"http://127.0.0.1:3000",//需要访问的服务器地址changeOrigin:true,//true是开启代理pathRewrite:{'^/adv':'/'//路径替换规则}},"/user":{target:"http://127.0.0.1:3000",//访问的服务器地址changeOrigin:true,//true是开启代理路径重写:{'^/user':'/'//路径替换规则}}}显然,在大多数情况下,我们不可能为每个api接口都在这里添加一条规则,所以更好的配置是:proxyTable:{'**':{target:'http://127.0.0.1:3000',changeOrigin:true,//允许跨域}}orproxyTable:[{context:['/**'],target:'http://127.0.0.1:3000',changeOrigin:true,//允许跨域}]是不是方便了很多?4.其他,比如jsonp通过接口回调实现跨域,现在用的比较少。window.postMessage()是HTML5的一个接口,专注于实现不同窗口、不同页面之间的跨域通信。这些都是针对单一界面或者页面级别的跨域,使用简单就不赘述了。
