前端跨域一些知识点

2019-04-22  本文已影响0人  Gen_

小结;

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 - 简书】https://www.jianshu.com/p/1a22e1aa0e49

【什么是跨域?如何解决? - 仰望星空得少年 - 简书】https://www.jianshu.com/p/8fa2acd103ea

上一篇下一篇

猜你喜欢

热点阅读