nodejs express中设置请求头允许跨域,自定义了请求头,就会多发送一次options请求

2020-04-12 17:33:26

有一种请求叫做Preflighted Request(带预检的跨域请求)。

Preflighted Request 在发送真正的请求前,会先发送一个方法为 OPTIONS 的 预请求(Preflighted Request), 用于试探服务端是否能接受真正的请求。 如果options获得的回应时拒绝性质的,如404、403、500等状态,就会停止post、get请求的发出。 所以,options成功后才会进行get post请求


nodejs express中设置请求头允许跨域

设置请求头允许跨域请求

app.js 文件中添加 代码


var app = express();


app.all('*', function (req, res, next) {

  // 设置请求头为允许跨域

  res.header('Access-Control-Allow-Origin', '*');

  // 设置服务器支持的所有头信息字段

  res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild, sessionToken');

  // 设置服务器支持的所有跨域请求的方法

  res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');

  if (req.method.toLowerCase() == 'options') {

      res.send(200);  // 让options尝试请求快速结束

  } else {

      next();

  }

});


自定义了一个请求头 sessionToken ,加入到 Access-Control-Allow-Headers中即可。


由于自定义了请求头,就会多发送一次options请求,

就会在控制台中看到一个接口被请求了2次,如下图:



为什么会发送OPTIONS请求?

有一种请求叫做Preflighted Request(带预检的跨域请求)。

Preflighted Request 在发送真正的请求前,会先发送一个方法为 OPTIONS 的 预请求(Preflighted Request), 用于试探服务端是否能接受真正的请求。 如果options获得的回应时拒绝性质的,如404、403、500等状态,就会停止post、get请求的发出。 所以,options成功后才会进行get post请求


跨域分为 简单跨域请求和复杂跨域请求

简单跨域 请求是不会发送options请求的

复杂跨域 请求会发送一个预检请求options

复杂跨域请求要满足以下:


请求方法不是GET/HEAD/POST

POST请求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain

请求设置了自定义的header字段

所以我们在请求头下面加入以下代码,能够尽快处理请求头为 options的请求。


if (req.method.toLowerCase() == 'options') {

      res.send(200);  // 让options尝试请求快速结束

  } else {

      next();

  }


  • 2019-08-28 08:28:36

    Js apply,call方法详解,及其apply()方法的妙用

    在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,并且在调用Person的时候参数的列表是对应一致的(也就是Person和Student的参数列表前两位是一致的) 就可以采用 apply , 如果我的Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade),这样就可以用call来实现了,也就是直接指定参数列表对应值的位置(Person.call(this,age,name,grade));

  • 2019-08-28 08:49:47

    Nginx + fastcgi + php 的原理与关系

    CGI对每个请求会parse一遍对应脚本的配置文件(如php.ini), 加载配置和扩展,初始化执行环境,性能非常差,所有有了下面的流程:

  • 2019-08-28 09:23:15

    php单例模式

    单例模式,是一种常见的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。

  • 2019-08-28 22:45:02

    彻底搞懂Gradle、Gradle Wrapper与Android Plugin for Gradle的区别和联系

    Gradle是个构建系统,能够简化你的编译、打包、测试过程。熟悉Java的同学,可以把Gradle类比成Maven。Gradle Wrapper的作用是简化Gradle本身的安装、部署。不同版本的项目可能需要不同版本的Gradle,手工部署的话比较麻烦,而且可能产生冲突,所以需要Gradle Wrapper帮你搞定这些事情。Gradle Wrapper是Gradle项目的一部分。

  • 2019-08-30 21:53:51

    OpenSSL实践-Android下的编译和使用

    openssl可以编译成ARM下面的二进制代码(动态库或者静态库),方便APP使用,APP在使用的时候,需要使用JNI来进行调用。