允许跨域请求,主要就是配置Response响应头中的 Access-Control-Allow-Origin 属性为你允许该接口访问的域名。

最常见的设置是:

res.header('Access-Control-Allow-Origin', '*');res.header('Access-Control-Allow-Credentials', 'true'); // 允许服务器端发送Cookie数据

然而,这样的设置是最简单粗暴,同时也是最不安全的。它表示该接口允许所有的域名对它进行跨域请求。然而,在一般实际业务中,都希望该接口只允许对某一个或几个网站开放跨域请求权限,而非全部。
那么,聪明的你肯定想着,多域名白名单还不简单吗,写个正则就好啦?再不行,直接配置 Access-Control-Allow-Origin 属性为用逗号分隔的多个域名不就好了吗?
就像下面这样:

res.header('Access-Control-Allow-Origin', '*.666.com');// 或者如下res.header('Access-Control-Allow-Origin', 'a.666.com,b.666.com,c.666.com');

很遗憾地告诉你,这样的写法是无效的。在Node.js中,res的响应头Header中的 Access-Control-Allow-Origin 属性不能匹配除 (*) 以外的正则表达式的,域名之间不能也用逗号分隔。也就是说, Access-Control-Allow-Origin 的属性值只允许设置为单个确定域名字符串或者 (*)。

既然 Access-Control-Allow-Origin 属性已经明确不能设置多个域名,那么我们只得放弃这条路了。
最流行也是最有效的方法就是,在服务器端判断请求的Header中Origin属性值(req.header.origin)是否在我们的域名白名单列表内。如果在白名单列表内,那么我们就把 Access-Control-Allow-Origin 设置成当前的Origin值,这样就满足了Access-Control-Allow-Origin 的单一域名要求,也能确保当前请求通过访问;如果不在白名单列表内,则返回错误信息。
这样,我们就把跨域请求的验证,从浏览器端转移到服务端来了。对Origin字符串的验证就变成了相当于常规字符串的验证,我们不仅可以使用数组列表验证,还可以使用正则匹配。
具体代码如下:
// 判断origin是否在域名白名单列表中

function isOriginAllowed(origin, allowedOrigin) {    if (_.isArray(allowedOrigin)) {        for (let i = 0; i < allowedOrigin.length; i++) {            if (isOriginAllowed(origin, allowedOrigin[i])) {                return true;            }        }        return false;    } else if (_.isString(allowedOrigin)) {        return origin === allowedOrigin;    } else if (allowedOrigin instanceof RegExp) {        return allowedOrigin.test(origin);    } else {        return !!allowedOrigin;    }}

const ALLOW_ORIGIN = [ // 域名白名单    '*.233.666.com',    'hello.world.com',    'hello..*.com'];

app.post('a/b', function (req, res, next) {    let reqOrigin = req.headers.origin; // request响应头的origin属性

    // 判断请求是否在域名白名单内    if (isOriginAllowed(reqOrigin, ALLOW_ORIGIN)) {        // 设置CORS为请求的Origin值        res.header("Access-Control-Allow-Origin", reqOrigin);        res.header('Access-Control-Allow-Credentials', 'true');

        // 你的业务代码逻辑代码 ...        // ...    } else {        res.send({ code: -2, msg: '非法请求' });    }});

Oh yeah,简直完美~
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。


本文整理自 ​作者:子匠_Zijor 的文章   ​

Node.js设置CORS跨域请求中多域名白名单的方法相关推荐

  1. Vue.js跨域请求配置、Node.js设置允许跨域

    Vue跨域配置 在Vue项目目录中打开config/index.js,在proxyTable中添写如下代码: // 跨域处理proxyTable: {'/api': { // 匹配所有以 '/api' ...

  2. springboot 添加允许跨域_springboot设置cors跨域请求的两种方式

    1.第一种: public class CorsFilter extends OncePerRequestFilter { static final String ORIGIN = "Ori ...

  3. HTTP中CORS跨域请求的实现(C++|Qt框架实现)

    目录 背景 关键 演示及源码 背景 HTTP中CORS跨域请求,可以获取其他服务器的数据: 这里用Qt框架实现! 逻辑如下: 浏览器访问127.0.0.1:80端口!80端口请求了127.0.0.1: ...

  4. 详细记录如何在跨域请求中携带cookie

    1. 搭建环境 1.生成工程文件 npm init 2.安装 express npm i express --save 3.新增app1.js,开启服务器1 端口:3001 const express ...

  5. js原生ajax跨域请求,封装一个原生js的ajax请求,支持IE9CORS跨域请求

    前言 关于纯js的ajax请求,我之前有文章写过, https://www.haorooms.com/post/js_ajax_chun , 关于CORS跨域资源共享,我也有文章写过, https:/ ...

  6. corspost请求失败_vue项目CORS跨域请求500错误,post请求变options请求

    vue项目CORS跨域请求500,post请求变options请求,到底是什么情况. 提示:以下内容是一个非专业开发的我对跨域的理解,并不10分准确. 一.先介绍为什么明明发送的是Post请求,为什么 ...

  7. CORS——跨域请求那些事儿

    [本期嘉宾介绍]睿得,具有多年研发.运维.安全等IT相关从业经历.目前从事CDN.存储.视频直播点播的技术支持.喜爱钻研,喜爱编码,喜爱分享. 在日常的项目开发时会不可避免的需要进行跨域操作,而在实际 ...

  8. java重定向跨域问题_重定向 CORS 跨域请求

    TL;DR 非简单请求不可重定向,包括第一个preflight请求和第二个真正的请求都不行. 简单请求可以重定向任意多次,但如需兼容多数浏览器,只可进行一次重定向. 中间服务器应当同样配置相关 COR ...

  9. SpringBoot2.1.5 (22)--- SpringBoot设置支持跨域请求

    SpringBoot2.1.5 (22)--- SpringBoot设置支持跨域请求 现代浏览器处于安全的考虑,在http/https请求时必须遵守同源策略,否则即使跨域的http/https 请求, ...

最新文章

  1. cactiez----监控windows主机 server 2008 r2
  2. Android 线程 thread 两种实现方法!
  3. Java文件类boolean setExecutable(boolean exec_file,boolean owner_access)方法,带示例
  4. LeetCode 740. 删除与获得点数(排序+动态规划)
  5. [论文阅读] State-Relabeling Adversarial Active Learning
  6. 建设自己拥有的B2C网站一般需要什么样的插件以及大体花费
  7. Office 365强势来袭PART2:云中SharePoint
  8. 微软启动Menlo计划;英特尔手机处理器上市(每日关注20100505)
  9. csrss.exe和winlogon.exe引起cpu居高不下的解决办法
  10. 市场热门行驶证识别性能测评对比
  11. 【论文笔记】MOBA类游戏中的强化学习论文5篇
  12. 断点下载的主要知识总结。
  13. VSCode创建vue模板(快捷方便)
  14. 云计算简史_云计算的概念和发展历史
  15. 软件工程(2018)结对编程第2次作业
  16. 鲁四海解读中国大数据发展10大趋势5大挑战 —— 首席数据官联盟2016《中国大数据企业排行榜》发布会实录...
  17. Android中高级进阶开发面试题冲刺合集(四)
  18. tar 命令打包压缩tar.gz,不包含当前文件夹路径
  19. jQuery选择器之类选择器
  20. 哈密顿算子及拉普拉斯算子的基本性质及证明

热门文章

  1. 面向对象第二节课,属性,构造方法,成员方法
  2. 珍藏40个android应用源码分享
  3. 教你10分钟搭建酷炫的个人博客
  4. Day26:configparser、subprocess模块
  5. R12.2.6 installation failed with - Unable to rename database
  6. (第一周)软件工程四人组
  7. COJ-1271 Brackets Sequence
  8. 【Java】身份证的验证
  9. JMeter中如何实现跨线程组关联
  10. 支付功能如何软件测试