学习后端第四天——解决跨域问题:CORS、AJAX的JSONP、Proxy

335 阅读3分钟

解决跨域问题:

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?

image.png

从上面的浏览器对跨域报错的信息来看,只需要再被请求的路由中设置header头,就可以实现跨域。

在被访问的页面的后端index.js文件中输入 res.setHeader("Access-Control-Allow-Origin","url")

第一个参数:响应头(对其添加一个标识:服务器是允许跨域的)

第二个参数:url,代表被访问的页面允许url这个网址共享自己的数据资源。(url可以为具体的网址,也可以为**代表不管是谁都可以访问这个被访问页面的数据资源)

  • Access:接受
  • Control:控制
  • Allow:允许
  • Origin:源

image.png

image.png

image.png

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:

image.png

2.JSONP:

image.png

后端代码:

mian.js文件:

image.png

代码运行结果:

image.png

3.Proxy

原理:

用户请求服务器,得到一个网页,网页里面写代码,继续请求服务器,服务器没有数据,就利用网络请求去请求另外的服务器,得到了数据,再生成buffer(二进制编码),返回给用户。这台服务器就叫代理服务器。

image.png

拓展:

  • 1.钓鱼网站(违法):前端请求后端,后端去请求别的的网页数据,然后修改了,发给用户。

  • 2.大数据分析:后端请求别的ajax网址数据,对其进行数据处理,发给用户。

  • 3.爬虫(灰色):后端请别的静态文件和数据,进行数据处理,发给用户。

  • 4.proxy代理服务:前端请求后端服务器,后端合法的去请求别的后端(oAuth授权—token),再发给前端,前端收到数据,再写成自己的页面。

代码

导入一个第三方模块request:

注意:第二个参数是一个函数,函数里面有三个参数。

  • 参数1:error

  • 参数2:response

  • 参数3:body

image.png

代码运行结果:

image.png

代码打印结果:

image.png