什么是ajax跨域问题?
前台调用后台服务接口时,如果这个接口不是同一个域,就会有跨域问题。
产生跨域问题的原因?
浏览器对ajax请求的限制
浏览器禁止跨域+发送的type是xhr(xmlhttprequest)+请求是跨域的
解决跨域的思路?
1、 从浏览器入手:通过指定参数让浏览器不去做校验(价值不大,因为需要每个人都做改
动,而且改动是客户端的)。
浏览器禁止校验思路:在浏览器的安装目录启动终端,输入禁止浏览器做跨域检查的校验参数,新启一个浏览器。命令参数:chrome --disable-web-security --user-data-dir=g:\temp3
2、 从xhr入手:用jsonp,通过动态创建script,在script发出跨域请求(服务器需要改动
代码,当调用接口不是自己的代码就没办法了;只支持get方法;发送的不是xhr请求,xhr有很多新特性,例如异步、各种事件,jsonp都没有)
Jsonp实现原理:请求发出去的时候加了callback参数(默认参数是callback),前后台约定了如果参数带了callback,就是jsonp请求,就要返回js。因此,后台把json变成js,js内容是函数调用形式,callback的值作为函数名,返回的数据作为函数参数。
Jsonp请求和和普通ajax请求的区别:1、普通ajax请求发出的type是xhr,jsonp发出请求类型是script,所以浏览器不会进行校验,可以解决跨域问题;2、和普通的ajax相比,返回的类型不一样。普通的ajax请求返回的是json对象,而jsonp返回的是js脚本;3、url不同。Jsonp的url后面有callback参数。
3、从跨域入手:(1)、支持跨域。被调用方修改代码入手,让他支持基于http协议关于跨域方面的要求而做出的修改。就是从a域名调用b域名时,给b域名访问的信息中加入一个字段,告诉浏览器同意a域名的调用,浏览器只要通过校验就可以调用(如果被调用方不是自己公司的,就无法修改);(2)、隐藏跨域。调用方修改入手,通过代理从浏览器发出去的都是a域名的请求,在代理里把指定的url转给b域名,这样浏览器看起来就是同一个域名,就没有跨域的问题。
被调用方解决(支持跨域):
方法一:服务器端实现
方法二:NGINX配置/Apache配置
调用方解决(隐藏跨域)