Node.js系列——express框架解决接口跨域问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


接口跨域问题

解决接口跨域问题的方案主要有两种:

  1. CORS
  2. JSONP(只支持GET请求)

CORS

cors是Express的一个第三方中间件,通过安装和配置cors中间件,可以很方便地解决跨域问题;
使用步骤分为以下三步:

  • 运行npm install cors安装中间件
  • 使用const cors = require('cors')导入中间件
  • 在路由之前调用app.use(cors())配置中间件

CORS由一系列HTTP响应头组成,这些HTTP响应头决定浏览器是否阻止前端JS代码跨域获取资源。浏览器的同源安全策略默认会组织网页“跨域”获取资源,但如果接口服务器配置了CORS相关的HTTP响应头,就可以解除浏览器端的跨域访问限制

CORS的注意事项:

  • CORS主要在服务器端进行配置,客户端浏览器无须做任何额外的配置,即可请求开启了CORS接口。
  • CORS在浏览器中有兼容性,只有支持XMLHTTPRequestLevel2的浏览器,才能正常访问开启CORS的服务端接口。

CORS相应头部

  • Access-Control-Allow-Origin:*号表示允许来自任何域的请求
  • Access-Control-Allow-Methods: 默认情况下,CORS仅支持客户端发起Get、POST、HEAD请求,如果客户端希望通过PUT、DELETE等方式请求服务器的资源,则需要在服务器端,通过Access-Control-Allow-Methods来指明实际请求所允许使用的HTTP方法。

CORS请求的分类

简单请求GET、POST、HEAD三者之一
预检请求:只要符合以下任何一个条件的请求,都需要进行预检请求

  • 请求方式为GET、POST、HEAD之外的请求Method类型
  • 请求头中包含自定义头部字段
  • 向服务器发送了application/json格式的数据

在浏览器与服务器正式通信之前,浏览器会先发送OPTION请求进行预检,以获知服务器是否允许该实际请求,所以这一次的OPTION请求称为”预检请求“。服务器成功响应预检请求后,才会发送真正的请求,并且携带真实数据。

简单请求和预检请求的区别

  • 简单请求的特点:客户端与服务器之间只会发生一次请求
  • 预检请求的特点:客户端与服务器之间会发生两次请求,OPTION预检请求成功之后,才会发起真正的请求.

JSONP接口

浏览器通过script标签的src属性,请求服务器上的数据,同时,服务器返回一个函数的调用,这种请求数据的方式叫做JSONP.

特点:

  • JSONP不属于真正的Ajax请求,因为它没有使用XMLHTTPRequest对象;
  • JSONP仅支持GET请求,不支持POST、PUT、DELETE请求;

创建JSONP接口的注意事项

如果项目中已经配置了CORS跨域资源共享,为了防止冲突,必须在配置CORS中间件之前声明JSONP接口,否则JSONP接口会处理成开启CORS的接口。

实现JSONP接口的步骤

  • 获取客户端发送过来的回调函数的名字
  • 得到要通过JSONP形式发送给客户端的数据
  • 根据前两步得到的数据,拼接处一个函数调用的字符串
  • 把上一步拼接得到的字符串,响应给客户端的script标签进行解析执行

JSON接口

调用$.ajax()函数,提供JSONP的配置选项,从而发起JSON请求

$.ajax({
    
    
    type: 'GET',
    url: 'http://127.0.0.1/api/jsonp',
    dataType: 'jsonp',
    success: function(res) {
    
    
        console.log(res);
    }
})

猜你喜欢

转载自blog.csdn.net/hjw15910531612/article/details/127732783
今日推荐