小结;
1、跨域是因为请求资源的服务器和资源服务器的协议,域名和端口不同,为了不跨域,就要让他们处在同一个域。如果是协议和端口不同,前端没法处理跨域。
2、常用的方法有一、JSONP(利用src没有跨域限制,传一个函数名作为参数到后台,后台拼接函数名和数据返回前端,然后自动调用前端的函数。缺点就是只能用get方法,限制多,不安全)
二、CORS(跨域资源共享,就是在后台响应头中设置Access-Control-Allow-Origin允许指定的域访问,缺点是不安全)
三、nginx(让请求和被请求的服务器处在同一个域下)
3、跨域虽然存在,但是请求依然发出并且返回,只不过是被浏览器拦截了。
由于src属性的值可以是任意的URL,因此来自一个Web服务器的JavaScript程序或Web页面可以使用由另一个Web服务器输出的代码。
所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
不同源的客户端脚本在没有明确授权下不能读取对方的资源。所以a.com下的js脚本采用ajax读取b.com里面的文件数据是会报错的。
如果要进行跨域请求,可以使用html的script标签来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用json传递js对象,这种跨域的通讯方式称为jsonp。
特别说明:
一:如果是协议和端口造成的跨域问题“前台”是无能为力的。
跨域并不是请求发不出去,请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。你可能会疑问明明通过表单的方式可以发起跨域请求,为什么 Ajax 就不会?
因为归根结底,跨域是为了阻止用户读取到另一个域名下的内容,Ajax 可以获取响应,浏览器认为这不安全,所以拦截了响应。但是表单并不会获取新的内容,所以可以发起跨域请求。同时也说明了跨域并不能完全阻止 CSRF,因为请求毕竟是发出去了。
1.当用户发送localhost:80/时会被nginx转发到http://localhost:81服务;
2.当界面请求接口数据时,只要以/apis 为开头,就会被nginx转发到后端接口服务器上;
总结:nginx实现跨域的原理,实际就是把web项目和后端接口项目放到一个域中,这样就不存在跨域问题,然后根据请求地址去请求不同服务器(真正干活的服务器);
CORS 全称是跨域资源共享(Cross-Origin Resource Sharing),是一种 ajax 跨域请求资源的方式
当你使用 XMLHttpRequest 发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:Origin,后台进行一系列处理,如果确定接受请求则在返回结果中加入一个响应头:Access-Control-Allow-Origin; 浏览器判断该相应头中是否包含 Origin 的值,如果有则浏览器会处理响应,我们就可以拿到响应数据后台进行一系列处理,如果确定接受请求则在返回结果中加入一个响应头:Access-Control-Allow-Origin; 浏览器判断该相应头中是否包含 Origin 的值,如果有则浏览器会处理响应,我们就可以拿到响应数据。
# 直接请求nginx也是会报跨域错误的这里设置允许跨域
# 如果代理地址已经允许跨域则不需要这些, 否则报错(虽然这样nginx跨域就没意义了)
add_header Access-Control-Allow-Origin *;
可以参考链接:
【跨域 - 饥人谷_fanison - 简书】//www.greatytc.com/p/1a22e1aa0e49
【什么是跨域?如何解决? - 仰望星空得少年 - 简书】//www.greatytc.com/p/8fa2acd103ea