解决跨域问题:
1.CORS:
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
2.AJAX的JSONP:
JSON with Padding,是一种借助于script 标签发送跨域请求的技巧,它本质并不是ajax请求,所以没有跨域问题.
3.Proxy:
是后端的一个网络请求工具(它没有跨域限制)
1.CORS
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10(ie8通过XDomainRequest能支持CORS)。
如果需要跨域,则需要配置响应头信息,标识是否允许。
我们应该怎样来实现CORS?
从上面的浏览器对跨域报错的信息来看,只需要再被请求的路由中设置header头,就可以实现跨域。
在被访问的页面的后端index.js文件中输入
res.setHeader("Access-Control-Allow-Origin","url")
第一个参数:响应头(对其添加一个标识:服务器是允许跨域的)
第二个参数:url,代表被访问的页面允许url这个网址共享自己的数据资源。(url可以为具体的网址,也可以为*,*代表不管是谁都可以访问这个被访问页面的数据资源)
- Access:接受
- Control:控制
- Allow:允许
- Origin:源
2.AJAX的JSONP
原理:利用script的src标签没有跨域限制来实现的
核心用法:
利用<script src="远程服务网址"></script>
返回值语法固定的:callback(JSON数据)
执行过程:
1.在前端创建一个解析函数jsonpCallback=function(arg){},当前端请求资源后,后端返回资源时,调用这个解析函数.
2.通过对网址进行包装(也就是在在网址上设置它的查询字段,以便前端解析函数的函数名与后端解析出来查询字段callback的值是一样的,便于使用\维护),利用script标签的src属性去请求跨域的资源
3.后端获取到前端声明的执行函数(jsonpCallback),并以带上参数且调用执行函数的方式传递给前端(后端返回值也就是一个特殊的字符串: 一个可以拼写的js 函数调用语句)
4.前端在script标签返回资源的时候就会去执行jsonpCallback并通过回调函数的方式拿到数据了。
代码案例(里面有很多更加容易让人理解的注释)
前端代码:
index.html文件:
1.AJAX:
2.JSONP:
后端代码:
mian.js文件:
代码运行结果:
3.Proxy
原理:
用户请求服务器,得到一个网页,网页里面写代码,继续请求服务器,服务器没有数据,就利用网络请求去请求另外的服务器,得到了数据,再生成buffer(二进制编码),返回给用户。这台服务器就叫代理服务器。
拓展:
-
1.钓鱼网站(违法):前端请求后端,后端去请求别的的网页数据,然后修改了,发给用户。
-
2.大数据分析:后端请求别的ajax网址数据,对其进行数据处理,发给用户。
-
3.爬虫(灰色):后端请别的静态文件和数据,进行数据处理,发给用户。
-
4.proxy代理服务:前端请求后端服务器,后端合法的去请求别的后端(oAuth授权—token),再发给前端,前端收到数据,再写成自己的页面。
代码
导入一个第三方模块request:
注意:第二个参数是一个函数,函数里面有三个参数。
-
参数1:error
-
参数2:response
-
参数3:body
代码运行结果:
代码打印结果: